当前位置:网站首页>ARC在编译期和运行期做了什么
ARC在编译期和运行期做了什么
2022-07-30 17:32:00 【Billy Miracle】
除了会自动调用“保留”与“释放”方法外,使用ARC还有其他好处,它可以执行一些手工操作很难甚至无法完成的优化。
在编译期,ARC会把能够相互抵消的retain、release、autorelease操作约简。如果发现在同一个对象上执行了多次“保留”与“释放”操作,那么ARC有时可以成对的移除这两个操作。ARC会分析对象的生存期需求,并在编译时自动插入适当的内存管理方法调用的代码,而不需要你记住何时使用retain、release、autorelease方法。编译器还会为你生成合适的dealloc方法。
将内存管理交由编译器和运行期组件来做,可以使代码得到多种优化。比如,ARC可以在运行期检测到autorelease后面跟随retain这一对多余的操作。为了优化代码,在方法中返回自动释放的对象时,会执行一个特殊函数。
一些问答
- 我应该如何看待 ARC ?它将
retains/releases调用的代码放在哪了?尝试不要去思考ARC将
retains/releases调用的代码放在哪里,而是思考应用程序算法,思考对象的strong和weak指针、所有权、以及可能产生的循环引用。 - 我还需要为我的对象编写
dealloc方法吗?有时候需要。因为ARC不会自动处理
malloc/free、Core Foundation对象的生命周期管理、文件描述符等等,所以你仍然可以通过编写dealloc方法来释放这些资源。你不必(实际上不能)释放实例变量,但可能需要对系统类和其他未使用ARC编写的代码调用[self setDelegate:nil]。ARC下的dealloc方法中不需要且不允许调用[super dealloc],Runtime会自动处理。 - ARC 中仍然可能存在循环引用吗?
是的,ARC自动
retain/release,也继承了循环引用问题。幸运的是,迁移到ARC的代码很少开始泄漏,因为属性已经声明是否retain。 block是如何在 ARC 中工作的?在ARC下,编译器会根据情况自动将栈上的
block复制到堆上,比如block作为函数返回值时,这样你就不必再调用Block Copy。
需要注意的一件事是,在ARC下,NSString * __block myString这样写的话,block会对NSString对象强引用,而不是造成悬垂指针问题。如果你要和MRC保持一致,请使用__block NSString * __unsafe_unretained myString或(更好的是)使用__block NSString * __weak myString。- ARC 速度上慢吗?
不。编译器有效地消除了许多无关的
retain/release调用,并且已经投入了大量精力来加速 Objective-C 运行时。特别的是,当方法的调用者是ARC代码时,常见的 “return a retain/autoreleased object” 模式要快很多,并且实际上并不将对象放入自动释放池中。
边栏推荐
- 习题:变量、常量和基本数据类型
- 京东获取推荐商品列表 API
- 一个 15 年 SAP ABAP 开发人员分享的 SAPGUI 一些个性化设置和实用小技巧试读版
- 数据库系统原理与应用教程(064)—— MySQL 练习题:操作题 51-61(八):查询条件的构造、通配符
- 链表Oj练习题 纯C语言
- 首发!阿里技术大牛最新耗时半个月整理出最全MySQL性能优化和高可用架构技术宝典,直接封神!
- 阿里巴巴CAN:Embedding前置的特征交互新思路
- Summary of String Copy, Concatenation, Comparison and Split Functions (1)
- 获得抖音商品详情 API
- C陷阱与缺陷 第6章 预处理器 6.2 宏并不是函数
猜你喜欢

公司部门来了个00后测试卷王之王,老油条表示真干不过,已经...

JMeter笔记3 | JMeter安装和环境说明

torch.optim.Adam() function usage

LeetCode167:有序数组两数之和

知识蒸馏2:目标检测中的知识蒸馏

Express framework connects MySQL and ORM framework

Win11如何把d盘空间分给c盘?Win11d盘分盘出来给c盘的方法

LeetCode167: Sum of two numbers in sorted array

Promise入门到精通(1.5w字详解)

Redis缓存穿透-热点缓存并发重建-缓存与数据库双写不一致-缓存雪崩
随机推荐
向量检索基础方法总结
S7-200SMART中定时器的使用方法和常见注意事项汇总
FP6600QSO SOP-8 USB专用充电端口控制器 用于快充电协议和QC2.0/3.0
matlab simulink锂离子电池智能充电策略研究
WeChat applet picker scroll selector use detailed explanation
【综合类型第 34 篇】喜讯!喜讯!!喜讯!!!,我在 CSDN 的第一个实体铭牌
微信小程序picker滚动选择器使用详解
C陷阱与缺陷 第6章 预处理器 6.2 宏并不是函数
线程同步 控制执行顺序
数据预处理:离散特征编码方法
哎,这要人老命的缓存一致问题啊
自动化早已不是那个自动化了,谈一谈自动化测试现状和自我感受……
LeetCode318: Maximum product of word lengths
如何让 JOIN 跑得更快?
Mongoose模块
How Google earth engine realizes the arrangement and selection of our time list
游戏化产品搭建思路的拆解与探究
FP6606CMP5 CPC-16L USB类型-C和PD充电控制器 百盛电子代理商
Dive deep on Netflix‘s recommender system(Netflix推荐系统是如何实现的?)
JMeter笔记3 | JMeter安装和环境说明