参考博客:

http://blog.leichunfeng.com/blog/2015/06/26/objective-c-associated-objects-implementation-principle/

从之前实例的内存结构,cls的对象结构,以及category的实现原理知道,可以通过 Category 给一个现有的类添加属性,但是却不能添加实例变量。

可以通过 Associated Objects 来弥补这一不足,以下主要介绍Associated Objects的实现原理。

同时要关注3个问题:

  1,关联对象被存储在什么地方,是不是存放在被关联对象本身的内存中

  2,关联对象的五种关联策略

  3,关联对象的生命周期是怎样的,什么时候被释放,什么时候被移除

1,关联对象的五种策略:

  关联函数相关的有3个函数:

setAssociatedObject中的key值,一般可以用:

  1,static char CHARKEY 和 &CHARKEY;

  2,static void *kAssociatedObjectKey = &kAssociatedObjectKey;

  3,对于配对出现的setter和getter,可以灵活应用_cmd。但是其他地方这样用,对于绑定变量的获取不好用。

绑定的五种策略:

2,关联对象的生命周期:

  会根据绑定策略的不同而不同。

  objc_association_assign的关联对象,在自身所在的runloop结束后,就会被释放。

  其他强持有的绑定方式,在会在被关联对象(宿主对象,比如绑定给self)被释放后,调用_object_remove_assocations,把宿主对象的所有关联对象移除,最终,强指针指向的那些对象被释放。

3,实现机制:

  1,其实系统全局维护了一个无序的哈希表AssociationsHashMap,维护了对象地址到ObjectAssociationMap的映射。也就是说,每一个对象都维护这自己的一个ObjectAssociationMap。

  2,ObjectAssociationMap维护了从key到ObjcAssociation的映射。也就是关联记录。

  3,至于ObjcAssociation,表示一个具体的关联结构,主要包括两个实例变量,_policy 表示关联策略,_value 表示关联对象。

 所以setAssociatedObject的原理就可以清楚,

  1,首先根据对象的地址,在AssociationsHashMap中获取ObjectAssociationMap。如果ObjectAssociationMap不存在则创建。

  2,根据传入的key值在ObjectAssociationMap中创建一个ObjcAssociation。如果原本的对应关系已经有,则会释放原有的对应关系,再创建新的对应。

 getAssociatedObject的原理也可以清楚:

  1,首先根据对象的地址,在AssociationsHashMap中获取ObjectAssociationMap。如果能找到,则2,否则3

  2,如果找到,则进一步根据 key 在 ObjectAssociationMap对象中查找这个 key 所对应的关联结构 ObjcAssociation 。如果能找到,则返回 ObjcAssociation 对象的 value 值。

  3,否则返回nil。

所以一开始第1个问题:

  1,关联对象被存储在什么地方,是不是存放在被关联对象本身的内存中

  不是的。一个实例的内存结构是已经定下的。关联对象和宿主对象的存储不是直接相关的。而是在一张全局哈希表里维护的。

ps,

  关于5种策略。OBJC_ASSOCIATION_RETAIN_NONATOMIC等强持有策略,可以让宿主对象持有关联对象。而使用assign策略,关联对象是不会被持有的。

【引】objective-c,5:Associated Objects 的原理的更多相关文章

  1. Struts1的实现原理

    一 开文背景 -- 废话讲一段~ 本文借助动力节点-王勇老师的视频教程中的引例来了解struts1的实现原理,虽然现在已经很少使用struts1了,但是了解了其原理之后,对了解其他mvc框架还是有较大 ...

  2. Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

    Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装:            将一些东西封装到一个地方,你还可以取出来( ...

  3. Runtime-b

    感谢大神分享 依旧是网上很多runtime的资料,依旧是看不懂,,,这里给大家转化一下runtime,使它由隐晦难懂变得通俗易懂. (虽然截图和语言组织的有些凌乱,但是大家还是一点一点的阅读下去吧,可 ...

  4. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  5. MapReduce三种join实例分析

    本文引自吴超博客 实现原理 1.在Reudce端进行连接. 在Reudce端进行连接是MapReduce框架进行表之间join操作最为常见的模式,其具体的实现原理如下: Map端的主要工作:为来自不同 ...

  6. OpenCL双边滤波实现美颜功能

    OpenCL是一个并行异构计算的框架,包括intel,AMD,英伟达等等许多厂家都有对它的支持,不过英伟达只到1.2版本,主要发展自己的CUDA去了.虽然没有用过CUDA,但个人感觉CUDA比Open ...

  7. Object Pascal中文手册 经典教程

    Object Pascal 参考手册 (Ver 0.1)ezdelphi@hotmail.com OverviewOverview(概述)Using object pascal(使用 object p ...

  8. Linux 内核/驱动开发总结

    总体来看,需要一个阶段性总结了,因为现在SD卡的调试也进入了卡壳期.大概会出一系列的总结文章,主要涉及的主题在下面列出: 1.开发工具:gcc/gdb/vim/ctags 2.Makefile和KCo ...

  9. 大数据笔记(九)——Mapreduce的高级特性(B)

    二.排序 对象排序 员工数据 Employee.java  ----> 作为key2输出 需求:按照部门和薪水升序排列 Employee.java package mr.object; impo ...

随机推荐

  1. latex使用问题总结1

    文献引用问题 若使用了\usepackage[super, square, number, sort&compress]{natbib},\cite的文献并不与文本平行,反而位于右上角 文献引 ...

  2. Apache php Mysql部署(一)下载安装

    前言 最近公司需要开发一个网站,但是又有特殊要求:不能使用java.只能在Windows平台部署.没方法,只能选择了Apache+php+Mysql的方案. 不知道有没有更好的,听所golang挺不错 ...

  3. 64位计算机安装setuptool

    Python Version 2.7 required, which was not found in the registry 新建注册表信息:HKEY_LOCAL_MACHINE\SOFTWARE ...

  4. Fiddler-3 配置Fiddler监听iphone的http/https请求

    电脑端可以通过Fiddler监听手机端的http请求.需要两个步骤:首先配置Fiddler,再配置手机端. 1 配置 Fiddler 允许远程设备连接: 菜单Tools - Telerik Fiddl ...

  5. https适配

    http://www.jianshu.com/p/f312a84a944c http://www.2cto.com/kf/201611/570823.html http://www.cnblogs.c ...

  6. xlwt写入中文操作不成功,提示UnicodeDecodeError: ascii codec can't decode byte ...

    打开xlwt包里的Workbook.py文件,修改Workbook类的__init__方法 将 def __init__(self, encoding='ascii', style_compressi ...

  7. 兼容各版本浏览器,封装原生Js获取ClassName

    web前端开发工作中常常会用到获取元素的className,用jQuery的$(".class")方法也可以获取className,但是有时候牵扯到数据而影响的加载顺序的原因会获取 ...

  8. 数据结构《19》----String容器的三种实现

    一.序言 一个简单的string 容器到底是如何实现的? 本文给出了 String 的三种从易到难的实现,涉及了 reference counting, copy on write 的技术. 二.第一 ...

  9. D3的参考样例

    官网进去就可以看到很多样例了.但是最喜欢的是mbostock的http://bl.ocks.org 然后其它的也有一些: 看上去很酷--http://www.visualcinnamon.com/po ...

  10. Valid Palindrome ---- LeetCode 125

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...