美文网首页iOS开发
OC中分类与扩展

OC中分类与扩展

作者: miliPolo | 来源:发表于2016-03-09 23:11 被阅读654次

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

    相关文章

      网友评论

        本文标题:OC中分类与扩展

        本文链接:https://www.haomeiwen.com/subject/lvfzkttx.html