美文网首页
iOS底层 -- Category本质之关联对象

iOS底层 -- Category本质之关联对象

作者: happy神悦 | 来源:发表于2020-09-08 02:28 被阅读0次

    通过分类的底层结构我们可以看到,分类中可以存放实例方法,类方法,协议,属性,但是没有存放成员变量的地方。
    默认情况下,因为分类底层结构的限制,不能添加成员变量到分类中。但可以通过关联对象来间接实现。

    关联对象

    一、关联对象提供了以下API:

    - (void)objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
    - (id)objc_getAssociatedObject(id object, const void * key)
    - (void)objc_removeAssociatedObjects(id object)
    

    二、key的常见用法:

    1.使用静态的指针类型

    static void *MyKey = &MyKey;
    objc_setAssociatedObject(obj, MyKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    objc_getAssociatedObject(obj, MyKey)
    

    2.使用基本数据类型

    static char MyKey;
    objc_setAssociatedObject(obj, &MyKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    objc_getAssociatedObject(obj, &MyKey)
    

    3.使用属性名作为key

    objc_setAssociatedObject(obj, @"property", value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    objc_getAssociatedObject(obj, @"property");
    

    4.使用get方法的@selecor

    objc_setAssociatedObject(obj, @selector(getter), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    objc_getAssociatedObject(obj, @selector(getter))
    

    三、objc_AssociationPolicy对应的修饰符

    objc_AssociationPolicy 对应的修饰符
    OBJC_ASSOCIATION_ASSIGN assign
    OBJC_ASSOCIATION_ASSIGN assign
    OBJC_ASSOCIATION_RETAIN_NONATOMIC strong, nonatomic
    OBJC_ASSOCIATION_COPY_NONATOMIC copy, nonatomic
    OBJC_ASSOCIATION_RETAIN strong, atomic
    OBJC_ASSOCIATION_COPY copy, atomic

    关联对象的原理

    一、实现关联对象技术的核心对象:

    • AssociationsManager
    • AssociationsHashMap
    • ObjectAssociationMap
    • ObjcAssociation

    二、四个核心对象的结构:

    三、四个核心对象之间对应关系:

    相关文章

      网友评论

          本文标题:iOS底层 -- Category本质之关联对象

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