http://blog.codingmylife.com/?p=41
Categories
#import “ClassName.h”
@interface ClassName ( CategoryName )
// method declarations
@end
#import “ClassName+CategoryName.h”
@implementation ClassName ( CategoryName )
// method definitions
@end
For example
@interface MyObject : NSObject{
NSNumber *number;
}
- (NSNumber *)number;
@end
@interface MyObject (Setter)
- (void)setNumber:(NSNumber *)newNumber;
@end
@implementation MyObject
- (NSNumber *)number{
return number;
}
- (void)setNumber(NSNumber *)newNumber{
number = newNumber;
}
@end
Protocol
@protocol MyProtocol
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end
For example
- Inherit multiple protocol. @interface Formatter : NSObject <Formatting, Prettifying>
- Instance. Protocol *myXMLSupportProtocol = @protocol(MyXMLSupport);
- Check if methods are declared
if(![receiver conformsToProtocol:@protocol(MyXMLSupport)]){
//Object does not conform to MyXMLSupport protocol
//If you are expecting receiver to implement methods declared in the
//MyXMLSupport protocol, this is probably an error
}
- -(NSString*)formattingService:(id<myXMLSupport>)anObject;
———————————————————————
http://icocoa.cn/ocsection/oc-tips/60-category-vs-protocol
Category
Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,我们可以为任何已经存在的class添加方法(不包括数据成员)却不需要访问该class的实现文件。
新添加的方法和原有的方法具有同等的地位,可以访问class的数据成员,并且完全植入到class的继承体系之中,子类同样会继承新添加的方法。 利用category对类进行扩展可以避免使类的继承体系过于臃肿,复杂,降低了维护成本。另外,新添加的方法如果和已经存在的方法具有相同的 prototype,那么新添加的方法将会覆盖已经存在的方法,也就是category使得使得在没有源文件时修改已存在class的 functionality或者清除bug成为可能,所有该class的对象的行为都将发生变化,这一点是继承无法达到的。
Category的缺点:
- 如果一个已经存在的方法被新方法覆盖,那么将没有任何途径可以对旧方法进行调用。这一点和继承是不同的,子类对父类成员函数重写(override),但我们依然可以对父类中的被重写的成员函数进行调用。
- 如果有多个category对同一个class的成员函数进行重写,那么具体的行为是未定义。
Category的应用:
- 对类进行扩展或patch。
- 使用category或(anonymous category)来模拟实现private method。
- 使用category(informal protocol)来实现delegation,在cocoa framework中就大量使用了category来声明delegate methods。
- 利用category把一个庞大的class划分为小块儿来分别进行开发,从而将functionality更好的进行划分,利于维护。
Protocol
根据字面意思,protocol就是一个协议,一个contract。一个class如果采用了某个protocol,那么它就必须要遵守这个协 议。从另外一个角度,只要我遵守了某个protocol或者标准,那我就可以和其它的类进行交互,而且其它类并不需要知道我的内部是如何实现的,例如 一套组合音响,只要其中的dvd,录音机等设备采用的是标准接口,那么它就可以很轻易的被放入这个音响系统中,发挥自己的功能。回到objective c,在cocoa touch framework中利用protocol声明delegate methods是同样的道理,cocoa touch framework,你们想要提供自定义功能或者响应某个事件吗?很简单,只要你们的功能遵守我提供的protocol。(注意,这里之所以采 用protocol来声明delegate methods,而不是cocoa framework中使用informal protocol(category),是因为objective c 2.0 引入了@optional methods,iphone又是在objective c 2.0之后出来的,所以cocoa touch framework中就用protocol替代informal protocol来声明delegate methods。)其实plugin,回调函数都是和protocol相同的思路。
另一方面,objective c只支持单一继承,protocol提供了一个途径来达到多重继承的目的。
Posted in Cocoa.
Tagged with category, class, iphone, mac, Protocol.
By admin
– August 15, 2010
1,NSThread
- (void)updateImageForCellAtIndexPath:(NSIndexPath *)indexPath
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *image = [self getImageForCellAtIndexPath:indexPath];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
[pool release];
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
[NSThread detachNewThreadSelector:@selector(updateImageForCellAtIndexPath:) toTarget:self withObject:indexPath];
}
2NSOperation
首先是建立NSOperationQueue和NSOperations。NSOperationQueue会建立一个线程,每个加入到线程operation会有序的执行。
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc];
initWithTarget:self
selector:@selector(doWork:)
object:someObject];
[queue addObject:operation];
[operation release];
下面是使用NSOperationQueue的过程:
- 建立一个NSOperationQueue的对象
- 建立一个NSOperation的对象
- 将operation加入到NSOperationQueue中
- release掉operation
使用NSOperation有几种,现在介绍最简单的一种NSInvocationOperation,NSInvocationOperation是NSOperation的子类,允许运行在operation中的targer和selector
3NSURLConnection
如果你是网络应用使用NSURLConnection的异步代理无意是最简便的解决方案
Posted in Cocoa.
Tagged with gcd, iphone, nsoperation, nstread, 多线程, 异步代理.
By admin
– August 12, 2010
View层次结构说明:
1.容器类,加强其他视图的功能,或提供额外的显示效果。
如:UIScrollView是用来显示那些内容太多,不能在一屏里显示的视图的;
UITableView是UIScrollView的子类,用来展现列表形式的内容的,因为表中的行是可选的,
UITableView也被用于层次结构的导航。
UIToolBar是用来显示一个或多个与按钮相似的子项,通常UIToolBar显示在屏幕底部,用来
显示一组经常使用的命令按钮。UIToolBar可以一直显示着,也可以在需要的时候才显示。
Continued…
Posted in Cocoa.
Tagged with iphone.
By admin
– July 31, 2010
由于工作需要,修改了下dedecms的showMsg()方法支持了外调模板.
却怎么也不能同步了.重新设置ucenter也无计于是.由于对ucenter不是很熟悉.所以只能调试.
经过半天的折腾才发现我漏掉了一个变量$ucsynlogin, uc_user_synlogin()的返回值.原来这
个返回的js是需要加载一下的.
原showMsg()里是这么写的isset($GLOBALS['ucsynlogin']) ? $GLOBALS['ucsynlogin'] : ”很
隐蔽的藏在一个字串里……真很纠结…
Posted in Life.
By admin
– June 30, 2010
计划周末现一个iphone版的rss阅读器.折腾了一天也没搞定.现记录一下.
由于我是新手所以遇到的我问题比较多,首先就现说所所遇到的问题:
1,异步和同步加载xml问题,刚开始为了方便使用的同步的方式加载解析xml这样会造成进程阻塞.
2,nsxmlparser这个库采用的sax的解析方式.比较习惯使用dom树的方式来擦作xml这个sax的方式还真有点不习惯.考虑xml to dictionary 同时保留分层结构.至今没想好怎么解决.觉得次方安的内存管理我还处理不好.
3,就是自己实现委托链.当通知是无序的时候就可以使用通知来处理,如果有先后顺序就可以考虑委托链.
4,刷新view 原来如此简单..只需要[xx reloadData]搞定.
(‘未完待续……..’)
鸣谢:(亿云,花太香齐,cocoachina,还有伟大的google…..)
Posted in Cocoa.
By admin
– June 27, 2010
1、”开-闭”原则——模块应对扩展开放,而对修改关闭。
2、里氏代换原则——如果调用的是父类的话,那么换成子类也完全可以运行。里氏代换原则是继承复用的一个基础。
3、合成复用原则——要少用继承,多用合成关系来实现。
4、依赖倒转原则——抽象不应该依赖与细节,细节应当依赖与抽象。
要针对接口编程,而不是针对实现编程。
5、迪米特法则——最少知识原则。不要和陌生人说话。
Posted in PHP.
By admin
– June 23, 2010
新建了一个apple 开发群:3467414,欢迎大家加入交流..
Posted in Life.
By admin
– June 17, 2010
今天工作需要又重新使用dedecms,粗略的看了下模板标签.我需要在标签里嵌套一个if标签.
经过了一个多小时的代码分析.宣告失败.他那个模板直接替换成html字符串.
让我很纠结哇.想到2年前的时候竟然没这个感觉.有空一定深入研究下.
Posted in PHP.
Tagged with cms, dede, 模板.
By admin
– June 9, 2010
mixed
mixed 说明一个参数可以接受多种不同的(但并不必须是所有的)类型。
例如 gettype() 可以接受所有的 PHP 类型,str_replace() 可以接受字符串和数组。
Continued…
Posted in PHP.
By admin
– June 2, 2010
无意中在周爱民的 javascript语言精髓中看到了一点关于fp特性的东西.顿时很感性.很喜欢那种简洁的风格.
Posted in Life.
By admin
– May 27, 2010