1、问题
你想要给一个类添加方法和行为,但你不想从头创建一个全新的子类。
2、解决方案
在Objective-C中,你可以用categories来定义和实现properties和methods,之后它们可以被附到一个类上。要完成这件事,你需要有2个文件:一个头文件列出接口、一个实现文件列出实现。当category搞好了,就可以导入该category头文件;任何将该category赋予其之上的类将会拥有这些properties和methods。
4、原理
你需要的第1个东西就是头文件。就说,你要扩展NSString类,加一些方法帮助你创建HTML文本。
下面是一个category头文件,里面有一个接口,代码如下:
@interface NSString (HTMLTags)
上面的NSString就是你要扩展的类。这意味着该category可能只会被运用到NSString(或NSString的子类)。在类名后面圆括号中的是给category的名字。
该category的properties和methods都要放在interface的后面,@end的前面。
实现:
@implementation NSString (HTMLTags)
5、代码
Listing 1-13. HTMLTags.h
#import <Foundation/Foundation.h>
@interface NSString (HTMLTags)
-(NSString *) encloseWithParagraphTags;
@end
==========================================
Listing 1-14. HTMLTags.m
#import "HTMLTags.h"
@implementation NSString (HTMLTags)
-(NSString *) encloseWithParagraphTags{
return [NSString stringWithFormat:@"<p>%@</p>",self];
}
@end
===========================================
Listing 1-15. main.m
#import "HTMLTags.h"
int main (int argc, const char * argv[]){
@autoreleasepool {
NSString *webText = @"This is the first line of my blog post";
//Print out the string like normal:
NSLog(@"%@", webText);
//Print out the string using the category function:
NSLog(@"%@", [webText encloseWithParagraphTags]);
}
return 0;
}
6、使用
Categories通常用在这些情形下:你想避免创建一个复杂的继承层次。Categories also help your code remain readable.例如,你想要在项目中用一个category来扩展NSString,你的大多数代码对于使用过NSString的其他人来说都是熟悉的。假如写一个NSString的子类,例如NSHTMLString,就可能会导致困惑。