美文网首页
分类中添加属性的实现原理

分类中添加属性的实现原理

作者: 初灬终 | 来源:发表于2019-10-13 06:32 被阅读0次

相关Class或Struct

AssociationsManager:全局唯一的关联对象管理者。

AssociationsHashMap:全局关联对象的hashMap,{DISGUISE(object):ObjectAssociationMap}

ObjectAssociationMap:某个对象的关联对象hashMap。{key:ObjcAssociation}

ObjcAssociation:关联对象的封装。{policy:0,value:"text"}

数据格式

{
    "0x4565412387": {
        "@selector(text)": {
            "policy": "copy",
            "value": "text"
        },
        "@selector(color)": {
            "policy": "retain",
            "value": "color"
        }
    },
    "0x1535342987": {
        "@selector(text)": {
            "policy": "copy",
            "value": "text"
        }
    }
}

}

源码(主干)

void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) {
    _object_set_associative_reference(object, (void *)key, value, policy);
}
void _object_set_associative_reference(id object, void *key, id value, uintptr_t policy) {
    // retain the new value (if any) outside the lock.
    ObjcAssociation old_association(0, nil);
    id new_value = value ? acquireValue(value, policy) : nil;
    {
        AssociationsManager manager;
        AssociationsHashMap &associations(manager.associations());
        disguised_ptr_t disguised_object = DISGUISE(object);

        //  传入的value不为空
        if (new_value) {
            
            // break any existing association.
            //在AssociationsHashMap迭代查找ObjectAssociationMap
            //在AssociationsHashMap找到了ObjectAssociationMap
            AssociationsHashMap::iterator i = associations.find(disguised_object);
            if (i != associations.end()) {
                // secondary table exists
                //AssociationsHashMap中是以disguised_object为key,ObjectAssociationMap为value
                //i->second表示取value
                ObjectAssociationMap *refs = i->second;

                ObjectAssociationMap::iterator j = refs->find(key);
                if (j != refs->end()) {
                    //ObjcAssociation对象原本有值,重新赋值。
                    old_association = j->second;
                    j->second = ObjcAssociation(policy, new_value);
                } else {
                    //ObjcAssociation对象原本没值,赋新值。
                    (*refs)[key] = ObjcAssociation(policy, new_value);
                }
            } else {
                // create the new association (first time).
                ObjectAssociationMap *refs = new ObjectAssociationMap;
                associations[disguised_object] = refs;
                (*refs)[key] = ObjcAssociation(policy, new_value);
                object->setHasAssociatedObjects();
            }
        } else { //传入value == nil
            // setting the association to nil breaks the association.
            //先以对象为key,在全局AssociationsHashMap查找
            AssociationsHashMap::iterator i = associations.find(disguised_object);
            //如果在AssociationsHashMap找到了
            if (i !=  associations.end()) {
                
                ObjectAssociationMap *refs = i->second;

                //ObjectAssociationMap中是以传入的key为key,以ObjcAssociation为value
                ObjectAssociationMap::iterator j = refs->find(key);
                if (j != refs->end()) {
                    old_association = j->second;
                    //如果传入value == nil,将会把传入的key,value键值对擦除。
                    refs->erase(j);
                }
            }
        }
    }
    // release the old value (outside of the lock).
    if (old_association.hasValue()) ReleaseValue()(old_association);
}

相关文章

  • 分类中添加属性的实现原理

    相关Class或Struct AssociationsManager:全局唯一的关联对象管理者。 Associat...

  • iOS开发 Category

    1.说下category原理,以及category为什么只能添加方法不能添加属性? 分类的实现是将category...

  • iOS Category分类

    1.说下category原理,以及category为什么只能添加方法不能添加属性? 分类的实现是将category...

  • 动态添加属性

    动态向类中加入属性 (未实现的方法并没有在类的MethodList)在分类中只能添加方法,不能添加属性,在分类中声...

  • vue中如何实现给样式添加作用域?说明其实现原理

    vue中要给样式添加作用域,只需要给style标签添加scoped属性即可. 实现原理: 添加了scoped属性的...

  • Runtime为分类添加属性-2021-02-24-周三

    正常情况下,分类可以添加方法,但是不能添加属性;通过runtime的关联对象,可以实现分类添加属性的目的; 分类头...

  • ios中的分类

    在ios中给分类添加属性,可以通过属性关联来实现重写set方法如下: -(NSMutableDictionary ...

  • OC中分类的实现原理

    OC中为类添加一个分类(Category)可以实现为类添加对象方法、类方法、添加属性(添加的属性不生成成员变量)、...

  • iOS-OC基础知识点扩展

    请简述分类实现原理 KVO的实现原理是怎样的 能否为分类添加成员变量 目录 分类 & 关联对象 & 扩展 & 代理...

  • ios 利用runtime给分类动态添加属性

    1、分类默认是不能添加属性的,这里我们用runtime实现给分类添加属性,本例给UIView添加一个string属...

网友评论

      本文标题:分类中添加属性的实现原理

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