美文网首页
给分类添加 属性

给分类添加 属性

作者: 紫云夕月 | 来源:发表于2019-05-18 09:23 被阅读0次

    1、分类是用于给原有类添加方法的,因为分类的结构体指针中,没有属性列表,只有方法列表。所以<原则上讲它只能添加方法, 不能添加属性(成员变量),实际上可以通过其它方式添加属性> ;

    为什么在分类中声明属性时,运行不会出错呢?

    既然分类不让添加属性,那为什么我写了@property仍然还以编译通过呢?

    我们知道在一个类中用@property声明属性,编译器会自动帮我们生成_成员变量和setter/getter,但分类的指针结构体中,根本没有属性列表。所以在分类中用@property声明属性,既无法生成_成员变量也无法生成setter/getter。

    因此结论是:我们可以用@property声明属性,编译和运行都会通过,只要不使用程序也不会崩溃。但如果调用了_成员变量和setter/getter方法,报错就在所难免了。

    既然报错的根本原因是使用了系统没有生成的setter/getter方法,可不可以在手动添加setter/getter来避免崩溃,完成调用呢?

    其实是可以的。由于OC是动态语言,方法真正的实现是通过runtime完成的,虽然系统不给我们生成setter/getter,但我们可以通过runtime手动添加setter/getter方法。那具体怎么实现呢?

    按照这个思路,我们通过运行时手动添加这个方法。

    #import <objc/runtime.h>

    static NSString *nameWithSetterGetterKey = @"nameWithSetterGetterKey";  //定义一个key值

    @implementation Programmer (Category)

    //运行时实现setter方法

    - (void)setNameWithSetterGetter:(NSString *)nameWithSetterGetter {

            objc_setAssociatedObject(self, &nameWithSetterGetterKey, nameWithSetterGetter, OBJC_ASSOCIATION_COPY);

    }

    //运行时实现getter方法

    - (NSString *)nameWithSetterGetter {

        return objc_getAssociatedObject(self, &nameWithSetterGetterKey);

    }

    @end

    相关文章

      网友评论

          本文标题:给分类添加 属性

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