美文网首页
OC关联对象

OC关联对象

作者: 再好一点点 | 来源:发表于2021-11-02 17:46 被阅读0次

    分类实现原理、加载时机

    一. 为什么使用关联对象

    为什么需要使用runtime的关联对象?为什么不在分类中直接添加成员变量?

    要弄明白这些问题就需要研究一下分类的具体数据结构。如图:

    分类数据结构
    由上图可知分类的数据结构中有实例方法列表、类方法列表、协议列表、属性列表。但是没有成员变量列表,所以从数据结构这一层就可以看出分类无法直接添加成员变量。
    添加的属性会生成set方法get方法但是不会生成成员变量。

    二. 关联对象示例

    在一个分类里边实现关联对象示例如下:

    这里有个小技巧,就是在使用runtime的关联对象api的时候那个key是一个指针,所以就有很多种写法,比如直接写一个字符串,但是字符串一旦有改动不容易发现,所以推荐使用get方法作为key

    @interface Person (Test)
    @property (copy, nonatomic) NSString *name;
    @property (assign, nonatomic) int weight;
    
    @end
    
    
    @implementation Person (Test)
    
    - (void)setName:(NSString *)name
    {
        objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    
    - (NSString *)name
    {
        // 隐式参数
        // _cmd == @selector(name)
        return objc_getAssociatedObject(self, _cmd);
    }
    
    - (void)setWeight:(int)weight
    {
        objc_setAssociatedObject(self, @selector(weight), @(weight), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (int)weight
    {
        // _cmd == @selector(weight)
        return [objc_getAssociatedObject(self, _cmd) intValue];
    }
    
    @end
    

    三. 关联对象存储在哪里

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

    AssociationsManager
    AssociationsHashMap
    ObjectAssociationMap
    ObjcAssociation

    objc4源码解读:objc-references.mm

    数据结构
    1. 关联对象并不是存储在被关联对象本身内存中
    2. 关联对象存储在全局的统一的一个AssociationsManager中
    数据存储结构

    相关文章

      网友评论

          本文标题:OC关联对象

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