首先类别跟扩展都可以添加新的方法,扩展或者说是一种默认的类别,不需要添加名称形如@interface NSObject(),而类别写法如此@interface NSObject(Setter),不同点在于,扩展可以添加新的属性,并且扩展一般是添加在.m文件中的,有一点需要注意的是,扩展中声明的函数需要在implement中实现,否则会报错
类别的作用有下面几点:
(1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。
(3)向对象添加非正式协议。
缺点有下面几点:
(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。
(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。解决办法:无法添加实例变量的局限可以使用字典对象解决
注意:
(1) Category的方法不一定非要在@implementation中实现,也可以在其他位置实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序则会崩溃。
(2) Category理论上不能添加变量,但是可以使用@dynamic来弥补这种不足。
static char*PersonNameKey ="PersonNameKey";
//name是你在头文件中的属性名称,PersonNameKey就相当于是一个keyId了
- (void)setName:(NSString*)name {
objc_setAssociatedObject(self,PersonNameKey, name,OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString*)name {
return objc_getAssociatedObject(self,PersonNameKey);
}
demo可以参见https://github.com/miliPolo/CategoryAddPropertyByRuntime