美文网首页iOS系统
iOS中Category如何实现属性,关联对象是如何实现的

iOS中Category如何实现属性,关联对象是如何实现的

作者: 长鲜 | 来源:发表于2019-03-15 17:34 被阅读0次

    首先要讲到一点
    就是extension和category是不同的概念。
    特别是针对属性这一点的区别上面,前者是在编译期决定的对象的内存分配,后者并不能在编译期去决定一个对象的内存分配。
    前者会生成一个私有成员变量,并且通过setter和getter去访问和操作这个成员变量。

    但是在category中,并不能去生成这个私有变量,因为对象的结构在编译期已经被决定了。
    所以想在category中实现属性的概念,那么就要用到关联类型了。

    会用到这两个函数,一个用来设置,一个用来获取

    objc_setAssociatedObject(self, @"name",name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    objc_getAssociatedObject(self, @"name");

    把对应代码放到属性的getter和setter里就可以实现需要的动态增加属性功能。

    -- 实现原理

    全局保存一个AssociationManager
    AssociationManger存有一个AssociationHashMap(哈希表,值类型为ObjectAssociationMap)
    根据传入的object做DISGUISE(系列的变形操作),并以此作为AssociationHashMap的键。

    ObjcAssociation是一个类型(包含了policy和value)

    如果是设值,就可以 创建一个ObjcAssociation(由传入的value和policy),并且根据传入的key,以键值的形式存储到object对应的ObjectAssociationMap里。

    如果是取值,就是通过object取到对应的ObjectAssociationMap,并且通过key,取到对应的ObjcAssociation, 再通过对应的value。

    相关文章

      网友评论

        本文标题:iOS中Category如何实现属性,关联对象是如何实现的

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