zoukankan      html  css  js  c++  java
  • oc引用计数原理-引用计数相关变化

    http://blog.csdn.net/null29/article/details/71191044

    在 32 位环境下,对象的引用计数都保存在一个外部的表中,每一个对象的 Retain 操作,实际包括如下 5 个步骤:

    1. 获得全局的记录引用计数的 hash 表;
    2. 为了线程安全,给该 hash 表加锁;
    3. 查找到目标对象的引用计数值;
    4. 将该引用计数值加 1,写回 hash 表;
    5. 给该 hash 表解锁。

    而在 64 位环境下,isa 指针也是 64 位,实际作为指针部分只用到其中 33 位,剩余的 31 位苹果使用了类似 Tagged Pointer 的概念,其中 19 位将保存对象的引用计数,这样对引用计数的操作只需要修改这个指针即可。只有当引用计数超出 19 位,才会将引用计数保存到外部表,但是这种情况是很少的。在 64 位环境下,新的 Retain 操作包括如下 5 个步骤:

    1. 检查 isa 指针上面的标记位,看引用计数是否保存在 isa 变量中,如果不是,则使用以前的步骤,否则执行第 2 步;
    2. 检查当前对象是否正在释放,如果是,不做任何事情;
    3. 增加该对象的引用计数,但是并不马上写回到 isa 变量中;
    4. 检查增加后的引用计数的值是否能够被 19 位表示,如果不是,则切换成以前的办法,否则执行第 5 步;
    5. 进行一个原子的写操作,将 isa 的值写回。

    虽然步骤都是 5 步,但是由于没有了全局的加锁操作,所以引用计数的更改更快了。

    10.5 isa 的 bit 位含义

    bit 位变量名意义
    1 bit indexed 0 表示普通的 isa,1 表示 Tagged Pointer
    1 bit has_assoc 表示该对象是否有过 associated 对象,如果没有,在析构释放内存时可以更快
    1 bit has_cxx_dtor 表示该对象是否有 C++ 或 ARC 的析构函数,如果没有,在析构释放内存时可以更快
    30 bits shiftcls 类的指针
    9 bits magic 其值固定为 0xd2,用于在调试时分辨对象是否未完成初始化
    1 bit weakly_referenced 表示该对象是否有过 weak 对象,如果没有,在析构释放内存时可以更快
    1 bit deallocating 表示该对象是否正在析构
    1 bit has_sidetable_rc 表示该对象的引用计数值是否大到无法直接在 isa 中保存
    19 bits extra_rc 表示该对象超过 1 的引用计数值,例如,如果该对象的引用计数是 6,则 extra_rc 的值为 5
  • 相关阅读:
    [BZOJ3829][Poi2014]FarmCraft 贪心
    【BZOJ 3144】 [Hnoi2013]切糕 真·最小割
    【BZOJ1458】士兵占领 最大流的模板题
    【COGS 14】 [网络流24题] 搭配飞行员 网络流板子题
    【BZOJ 4832】 [Lydsy2017年4月月赛] 抵制克苏恩 期望概率dp
    【BZOJ4325】NOIP2015 斗地主 搜索+贪心
    【BZOJ 1409】 Password 数论(扩展欧拉+矩阵快速幂+快速幂)
    【NOIP模拟赛】天神下凡 动态开点线段树
    【NOIP模拟赛】藏宝图 最小生成树
    【NOIP模拟赛】黑红树 期望概率dp
  • 原文地址:https://www.cnblogs.com/feng9exe/p/7240286.html
Copyright © 2011-2022 走看看