Hash
在iOS中的应用分析整理
1.1、关联对象的实现原理:
详细的原理可以查阅其他资料,这里只介绍一下实现中使用的基本数据结构。关联对象采用的是HashMap
嵌套HashMap
的结构存储数据的,简单来说就是根据对象从第一个HashMap
中取出存储对象所有关联对象的第二个HashMap
,然后根据属性名从第二个HashMap
中取出属性对应的值和策略。
设计关联对象的初衷是,通过传入 对象 + 属性名字 ,就可以找到属性值。方案设计实现好后,查找一个对象的关联对象的基本步骤:
-
- 1、 已知条件一:对象 ,因此引出第一个
HashMap
(AssociationsHashMap
),用一个能唯一代表对象的值作为key
,用存储对象的所有关联对象的结构(名字:值+策略)作为value
-
- 2、 已知条件二:属性名字 ,因此引出第二个
HashMap
(ObjectAssociationMap
),用属性名字作为key
,用属性名字对应的结构体(值+策略)作为value
参考资料:
1.2、weak的实现原理:
同样详细的原理可以查阅其他资料,这里只介绍一下实现中使用的基本数据结构。weak
采用的是一个全局的HashMap
嵌套数组的结构存储数据的,销毁对象(weak指针
指向的对象)的时候,根据对象从HashMap
中找到存放所有指向该对象的weak指针
的数组,然后将数组中的所有元素(weak指针
)都置为nil。
weak
的最大特点就是在对象销毁的时候,自动置nil
,减少访问野指针的风险
,这也是设计weak
的初衷。方案设计实现好后,weak
指针置nil
的基本步骤:
-
- 1、对象
dealloc
的时候,从全局的HashMap
中,根据一个唯一代表对象的值作为key
,找到存储所有指向该对象的weak
指针的数组 -
- 2、将数组中的所有元素都置为
nil
苹果对于weak的实现其实类似于通知的实现,指明谁(weak指针
)要监听谁(赋值对象
)什么事件(dealloc操作
)执行什么操作(置nil
)。
参考资料:
iOS 底层解析weak的实现原理(包含weak对象的初始化,引用,释放的分析) weak实现原理
1.3、KVO实现使用的基本数据结构
比较复杂,一个对象可以被n个对象观察,一对象的n个属性又可以分别被n个对象观察。
详细参考: GNUstep KVC/KVO探索(二):KVO的内部实现
1.4、iOS App签名的原理
一句话:一致性哈希算法
+ 非对称加解密算法
详细参考: iOS App 签名的原理
1.5、对象的引用计数存储的位置
具体参考 :苹果iOS系统源码思考:对象的引用计数存储在哪里?--从runtime源码得到的启示
if 对象支持TaggedPointer {
return 直接将对象的指针值作为引用计数返回
}
else if 设备是64位环境 && Objective-C2.0 {
return 对象isa指针的一部分空间(bits_extra_rc)
}
else {
return hash表
}
1.6、Runloop与线程的存储关系
线程和 RunLoop
之间是一一(子线程可以没有)对应的,其关系是保存在一个全局的 Dictionary
里。线程刚创建时并没有