oc引用计数原理-引用计数相关变化
原理 相关 引用 变化 计数 OC
2023-09-11 14:18:46 时间
http://blog.csdn.net/null29/article/details/71191044
在 32 位环境下,对象的引用计数都保存在一个外部的表中,每一个对象的 Retain 操作,实际包括如下 5 个步骤:
- 获得全局的记录引用计数的 hash 表;
- 为了线程安全,给该 hash 表加锁;
- 查找到目标对象的引用计数值;
- 将该引用计数值加 1,写回 hash 表;
- 给该 hash 表解锁。
而在 64 位环境下,isa 指针也是 64 位,实际作为指针部分只用到其中 33 位,剩余的 31 位苹果使用了类似 Tagged Pointer 的概念,其中 19 位将保存对象的引用计数,这样对引用计数的操作只需要修改这个指针即可。只有当引用计数超出 19 位,才会将引用计数保存到外部表,但是这种情况是很少的。在 64 位环境下,新的 Retain 操作包括如下 5 个步骤:
- 检查 isa 指针上面的标记位,看引用计数是否保存在 isa 变量中,如果不是,则使用以前的步骤,否则执行第 2 步;
- 检查当前对象是否正在释放,如果是,不做任何事情;
- 增加该对象的引用计数,但是并不马上写回到 isa 变量中;
- 检查增加后的引用计数的值是否能够被 19 位表示,如果不是,则切换成以前的办法,否则执行第 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 |
相关文章
- Verilog篇(三)仿真原理
- jQuery源码分析系列(35) : Ajax - jsonp的实现与原理
- 浅谈Flask 中的 线程局部变量 request 原理
- LinkedHashMap原理
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)
- 「RocketMQ 技术专题」帮你梳理 RocketMQ 相关的消费问题以及原理分析总结
- 网络编程之史上最通俗的集线器、交换机、路由器功能原理入门
- SAP ABAP数据库表字段checktable的实现原理
- Atitit 深入理解耦合Coupling的原理与attilax总结 目录 1.1. 耦合作为名词在通信工程、软件工程、机械工程等工程中都有相关名词术语。2 1.2. 所有的耦合形式可分为5类:
- Atitit 马尔可夫过程(Markov process) hmm隐马尔科夫。 马尔可夫链,的原理attilax总结
- Atitit WebDriver技术规范原理与概念
- Atitit.加密算法 des aes 各个语言不同的原理与解决方案java php c#
- XAI之ALE:ALE累积局部效应图可视化算法的简介(原理/意义/优缺点/应用)、常用工具包、案例应用之详细攻略
- 铁庵:NoSQL、RDS和大数据异构融合实战,详解PostgreSQL FDW功能原理
- Algorithm:C++语言实现之SimHash和倒排索引算法相关(抽屉原理、倒排索、建立查找树、处理Hash冲突、Hash查找)
- Algorithm之PGM之BNet:贝叶斯网络BNet的相关论文、过程原理、关键步骤等相关配图
- 【数字信号处理】相关函数应用 ( 相关函数应用场景 | 噪声中检测信号原理 )
- C#语言基础原理及优缺点
- Docker容器原理及相关知识
- spark sql架构和原理——和Hive类似 dataframe无非是内存中的table而已 底层原始数据存储可以是parquet hive json avro等
- MongoDB 分片的原理、搭建、应用
- RabbitMQ原理与相关操作(三)消息持久化
- RabbitMQ原理与相关操作(一)
- Kerberos认证原理与环境部署
- BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图
- redis的四大特性和原理
- 计算机组成原理 BootLoader/BIOS/U-Boot概念理解