苹果如何管理:retainCount、retain、release

来源:互联网 发布:darma公司 知乎 编辑:程序博客网 时间:2024/06/07 18:26
retainCount、retain、release的管理是基于散列表的,根据固定的key,再通哈希函数得到对应的value值。
下面简单介绍下散列表:
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数

哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。

对哈希表的使用者——人来说,这是一瞬间的事。哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树的操作通常需要O(N)的时间级。哈希表不仅速度快,编程实现也相对容易。

哈希表也有一些缺点它是基于数组的,数组创建后难于扩展某些哈希表被基本填满时,性能下降得非常严重,所以程序虽必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。

而且,也没有一种简便的方法可以以任何一种顺序〔例如从小到大〕遍历表中数据项。如果需要这种能力,就只能选择其他数据结构。

然而如果不需要有序遍历数据,井且可以提前预测数据量的大小。那么哈希表在速度和易用性方面是无与伦比的。


上面介绍了散列表,就是我们经常说的哈希表。
苹果引用计数 retainCount、retain、release大概也是采用散列表(引用计数)来管理引用计数;
其实,在哈希表中,至少有两个key值,一个是retainCount,另外一个就是对象内存块的地址的key值,当我们在release或者retain的时候,就会对该哈希表进行编辑操作,更新对象的持有者(增加或者减少).即使出现故障,导致对象占用的内存块损坏,但只要引用计数表没有被破坏,就能够确认各个内存块的位置。
另外,在利用工具进行检测内存泄露的时候,引用计数表的各个记录也有助于检测各个对象持有者是否存在。
所以,通过上述,也可以大概知道苹果是如何实现的了。

0 0