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

运行时给分类添加属性

作者: 伊蕊飘零 | 来源:发表于2016-08-05 23:42 被阅读49次

    今天写程序的时候写了一个分类,我们都知道分类是在不改变原类的基础上添加新方法,却不能添加属性,若是添加了那么调用的时候就会崩溃,那么怎么办呢??我们利用运行时可以实现动态的给类增加属性

    **扩展下:Gategory(分类/类别)
    分类只能增加方法不能增加成员变量,可以声明属性,实际上会生成属性的set和get方法,但不会生成带下划线的成员变量.
    若是在分类中用@property声明的属性,不会自动生成get /set方法的实现

    标记是哪个关联的key 一般常用的有三种写法
    1、static void *strKey = &strKey;
    2、static NSString *strKey = @"strKey";
    3、static char strKey;
    关联策略是个枚举值,解释如下:
    enum {
    OBJC_ASSOCIATION_ASSIGN = 0, //关联对象的属性是弱引用
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //关联对象的属性是强引用并且关联对象不 使用原子性
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3, //关联对象的属性是copy并且关联对象不使 用原子性
    OBJC_ASSOCIATION_RETAIN = 01401, //关联对象的属性是copy并且关联对象使用原子性 OBJC_ASSOCIATION_COPY = 01403 //关联对象的属性是copy并且关联对象使用原子性
    };

    完成后的整体代码如下:
    .h文件
    //分类的头文件
    @interface ClassName (CategoryName)
    @property (nonatomic, strong) NSString *str;
    @end
    
    .m文件
    #import <objc/runtime.h>
    //实现文件
    static void *strKey = &strKey;
     @implementation ClassName (CategoryName)
     ‐(void)setStr:(NSString *)str
    {
        objc_setAssociatedObject(self, & strKey, str, OBJC_ASSOCIATION_COPY);
    }
    ‐(NSString *)str
    {
              /*
                  1.要被关联的对象
                  2.关联的key
                  */
        return objc_getAssociatedObject(self, &strKey);
    }
    @end
    

    相关文章

      网友评论

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

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