iOS开发

OC中分类与扩展

2016-03-09  本文已影响654人  miliPolo

首先类别跟扩展都可以添加新的方法,扩展或者说是一种默认的类别,不需要添加名称形如@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

上一篇下一篇

猜你喜欢

热点阅读