【引】objective-c,5:Associated Objects 的原理
参考博客:
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 的原理的更多相关文章
- Struts1的实现原理
一 开文背景 -- 废话讲一段~ 本文借助动力节点-王勇老师的视频教程中的引例来了解struts1的实现原理,虽然现在已经很少使用struts1了,但是了解了其原理之后,对了解其他mvc框架还是有较大 ...
- Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)
Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: 将一些东西封装到一个地方,你还可以取出来( ...
- Runtime-b
感谢大神分享 依旧是网上很多runtime的资料,依旧是看不懂,,,这里给大家转化一下runtime,使它由隐晦难懂变得通俗易懂. (虽然截图和语言组织的有些凌乱,但是大家还是一点一点的阅读下去吧,可 ...
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- MapReduce三种join实例分析
本文引自吴超博客 实现原理 1.在Reudce端进行连接. 在Reudce端进行连接是MapReduce框架进行表之间join操作最为常见的模式,其具体的实现原理如下: Map端的主要工作:为来自不同 ...
- OpenCL双边滤波实现美颜功能
OpenCL是一个并行异构计算的框架,包括intel,AMD,英伟达等等许多厂家都有对它的支持,不过英伟达只到1.2版本,主要发展自己的CUDA去了.虽然没有用过CUDA,但个人感觉CUDA比Open ...
- Object Pascal中文手册 经典教程
Object Pascal 参考手册 (Ver 0.1)ezdelphi@hotmail.com OverviewOverview(概述)Using object pascal(使用 object p ...
- Linux 内核/驱动开发总结
总体来看,需要一个阶段性总结了,因为现在SD卡的调试也进入了卡壳期.大概会出一系列的总结文章,主要涉及的主题在下面列出: 1.开发工具:gcc/gdb/vim/ctags 2.Makefile和KCo ...
- 大数据笔记(九)——Mapreduce的高级特性(B)
二.排序 对象排序 员工数据 Employee.java ----> 作为key2输出 需求:按照部门和薪水升序排列 Employee.java package mr.object; impo ...
随机推荐
- Themida和Winlicense加壳软件脱壳教程
(一)Themida和不用license的Winlicense加壳软件就不说了,直接上脚本脱壳. (二)先看看不同版本OEP的一些小特征: Temida2.1.X.X版本之后的OEP特征(2.0.8. ...
- asp.net中关于Microsoft 信息完整性、隐私性等集成信息安全服务服务 integrated security=SSPI
string strConn=@"server=(local)\SQLExpress;database=AdventureWorks;integrated security=SSPI&quo ...
- mseed2sac的安装和使用
由于使用rdseed提取mseed文件到SAC文件会遇到一个问题就是: 同时需要dataless文件: 因此如果下载的数据中恰巧没有dataless文件,则需要用另外一种方式:mseed2sac 现在 ...
- 摆花(2012Noip普及组第3题)
摆花 (flower.cpp/c/pas) [问题描述] 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆.通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n ...
- Spring中Bean的生命周期方法
Bean的生命周期方法 src\dayday\Car.java package dayday;import com.sun.org.apache.xpath.internal.SourceTree;i ...
- HTML DOM对象之createElement()方法
今天在学习DOM节点操作时,发现了创建DOM节点的createElement()方法的一个有意思的现象. 代码如下: var box=document.getElementById("box ...
- Java 验证码工具类
package com.wuyu.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import ...
- 好久没写Blog了
上一年的经历: <炸年兽>搞了一阵后,美术去创业了.. 和另一个美术断断续续,做了个<斗战圣佛>,挺山寨的,都没敢跟别人说. 不管怎么说也算是自己上了一个appStore的游戏 ...
- elasticsearch-PHP第一天
遇到很大的问题就是,给边做边找原因,看官方文档,全英文看不懂.只能慢慢一步一步去做. 性子太急,真的不行,跨越性太大,卡一个小时多,才发现,连安装都没搞明白. 首先需要一个JAVA环境,上百度 ...
- nodejs入门 SSH服务器远程部署nodejs2
服务器安装nodejs昨天好像出了点问题 今天参考的链接是http://nodejs.cn/download/package-manager/#debian-and-ubuntu-based-linu ...