如果要对一个类进行扩展,通常的办法就是继承和组合。
Objective-C提供了另一个选择,引入了category机制,它允许程序员为已有的对象添加新的方法,即便是在没有该对象的源代码的情况下。其优点是利用这个机制,程序员可以把一堆方法分门别类,分成若干组,每组方法用一个Category名字加以命名,定义在同一个文件里。这也是为什么把这个机制叫做Category的原因。
比如需要为NSString类添加一个新的方法,继承的方式就不太可取,原因在于NSString是个class cluster,一个类簇。什么是一个类簇?简单的来说,NSString是个“工厂类”,然后它在外层提供了很多方法接口,但是这些方法的实现是由具体的内部类来实现的。当使用NSString生成一个对象时,初始化方法会判断哪个“自己内部的类”最适合生成这个对象,然后这个“工厂”就会生成这个具体的类对象返回给你。这种又外层类提供统一抽象的接口,然后具体实现让隐藏的,具体的内部类来实现,在设计模式中称为“抽象工厂”模式。
因此,对于 NSString,NSDictionary等“类簇”类时,最好用“组合”或者“Category”来进行扩展。
注意:Category只能用于方法,不能用于成员变量。
//如已定义Circle类,CircleCal.h文件中,
#import "Circle.h"
@interface Circle(CircleCal)
-(float) AreaCal;
-(float) LenCal;
@end;
// CircleCal.m文件中,
#import "CircleCal.h"
@implementation Circle(CircleCal)
-(float) AreaCal{}
-(float) LenCal{}
@end;
// 此时便可在main函数中调用新定义的函数;
参考:
Cocoa核心能力:类簇
objc’s category and class cluster
MAC 开发笔记——Objective C 语法之Category和Extension