美文网首页
iOS-Category管理对象的原理

iOS-Category管理对象的原理

作者: 翀鹰精灵 | 来源:发表于2020-12-29 17:41 被阅读0次

上次我们说到 iOS-Category添加成员变量 是通过 objc_setAssociatedObjectobjc_getAssociatedObject来实现的,我们一起来探究下这两个方法的底层实现。

我们可以通过下载开源的runtime的代码,来查看一下底层的实现方法。Runtime的开源代码

【_object_set_associative_reference】

01.jpg
【_object_get_associative_reference】
02.jpg

通过上图的方法可以看到,实现关联对象技术的核心对象为一下四个:

AssociationsManager
AssociationsHashMap
ObjectAssociationMap
ObjcAssociation

这四个的关系如下所示:

class AssociationsManager {
    ...
    AssociationsHashMap &get() {
        return _mapStorage.get();
    }
    ...
};
typedef DenseMap<DisguisedPtr<objc_object>, ObjectAssociationMap> AssociationsHashMap;

typedef DenseMap<const void *, ObjcAssociation> ObjectAssociationMap;

class ObjcAssociation {
    uintptr_t _policy;
    id _value;
};
03.jpg 04.jpg

/**
① id object --相当于Person对象
② const void *key 对应ObjectAssociationMap
③ id value --ObjcAssociation中的value
④ uintptr_t policy--ObjcAssociation中的policy
*/
_object_set_associative_reference(id object, const void *key, id value, uintptr_t policy)

由上图可知,关联对象并不是放在原来对象里面,而是通过runtime自己维护了一个Map。

【总结】:

  • 关联对象并不是存储在被关联对象本身内存中;
  • 关联对象存储在全局统一的一个AssociationsManager中
  • 设置关联对象为nil ,就相当于移除当前关联对象;
  • 调用objc_removeAssociatedObjects(<#id _Nonnull object#>)方法,移除Person类中所有的关联对象。

相关文章

  • iOS-Category管理对象的原理

    上次我们说到 iOS-Category添加成员变量[https://www.jianshu.com/p/9c466...

  • Objective-C的本质(5)——Category原理

    参考:iOS-Category原理iOS底层原理总结 - Category的本质 1、load能继承吗 可以继承,...

  • iOS-Category原理

    参考篇:iOS-分类(Category) 前言:本文简述Category原理,如有错误请留言指正。 第一部分:有关...

  • IOS-Category实现原理

    分类(Categroy) 你用分类都做了那些事? 声明私有方法 分解体积庞大的类文件 把Framework的私有方...

  • OC关于在MRC模式下的内存管理学习

    内存管理 管理范围 任何继承NSObject的对象 只有OC对象才需要进行内存管理的本质原理 1.OC对象在堆中 ...

  • 【ceph】未解决问题

    对象存储-性能验证; 对象存储-配置问题; 对象存储-管理问题; 对象存储-ceph原理; OSD有没有数量要求?...

  • iOS 内存管理

    内存管理的原理 iOS 内存管理,是基于引用计数来管理内存;当对象引用计数为0时,对象将被销毁,回收内存空间;内存...

  • iOS内存管理总结(ARC/MRC)

    MRC原理 MRC: 手动管理内存(retain, release, autorelease,不多说) 持有对象,...

  • MRC、ARC内存管理机制

    MRC、ARC内存管理机制?(为什么要进行内存管理, 内存管理的范围和对象, 内存管理的原理) ** (为什么)...

  • “理解”iOS内存管理

    引言:我们都知道Objective-C通过“引用计数”来管理对象释放。基本原理就是管理对象的持有者个数(引用计数)...

网友评论

      本文标题:iOS-Category管理对象的原理

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