美文网首页
iOS 给分类添加属性关联对象

iOS 给分类添加属性关联对象

作者: middo | 来源:发表于2019-10-31 16:01 被阅读0次

    分类里添加属性,仅仅是生成了set和get方法的声明,并没有实现,需要我们自己写set和get的方法。

    几种set,get方法实现案例

    1.可以全局字典实现属性的存取

    //声明全局的字典

    NSMutableDictionary *_names_;

    //load方法实现字典

    + (void)load

    {

       _ names_ = [NSMutableDictionary dictionary];

    }

    //实现set方法

    -(void)setName:(NSstring *)name

    {

       NSString *key = [NSString stringWithFormat:@"%p", self];

        names_[MJKey] = name;

    }

    //实现get方法

    - (NSString *)name

    {

    //    NSString *key = [NSString stringWithFormat:@"%p", self];

        return names_[MJKey];

    }

    存在的问题:

    全局变量无法释放 

    如果每个类在不不同的线程,同时访问set和get,如果不不加锁,可能会出现问题

    2.关联对象

    - (void)setName:(NSString *)name

    {

        objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);

    }

    - (NSString *)name

    {

        // 隐式参数

        // _cmd == @selector(name)

        return objc_getAssociatedObject(self, _cmd);

    }

    第四个参数为关联策略,和变量的对应关系

    关联策略,参数4

    第二个参数key

    参数2可以多样化

    第一种方法利用字符串作为key,其中利用@"string",这样写的字符串是放在常量区的,无论哪里用到都是同一内存同一地址,但是这样写容易写错,且编译器没有提醒

    更推荐第二种写法,不容易记错其中@selector(name),_cmd_,是函数的隐式参数

    实现关联对象技术的核心对象

    AssociationsManager

    AssociationsHashMap

    ObjectAssociationMap

    ObjectAssociation

    源码解读

    其中AssociationsManager类管理了一个全局的散列表,key是添加管理属性的对象,value是ObjectAssociationMap的散列表,其中key是第二个参数,value是ObjectAssociation类,ObjectAssociation其中包含有value和policy,也就是我们传入的第三和第四个参数

    全局数据结构

    关联对象并不是存储在被关联对象本身的内存中

    关联对象存储在全局的同一的AssociationsManager中

    设置关联对象为nil,相当于移出关联对象

    相关文章

      网友评论

          本文标题:iOS 给分类添加属性关联对象

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