ARC的工作原理

之前有学过一些关于ARC和MRC的东西,可以看MRC
ARC


这篇记录一下在运行期和编译器ARC都干了什么

干了什么

chat:在计算机科学中,ARC(自动引用计数)是一种内存管理技术,用于跟踪和管理对象的引用计数,以便在不再需要时释放对象所占用的内存。
在运行期,ARC负责跟踪对象的引用计数。每当有一个新的引用指向对象时,引用计数会增加;当引用结束时,计数会减少。当引用计数为零时,表示对象不再被任何代码引用,可以安全地释放对象所占用的内存。因此,ARC在运行期监测并管理对象的生命周期。
在编译期,ARC由编译器自动生成和插入相关代码来实现引用计数的维护。具体而言,编译器会分析代码,并在合适的位置插入retain、release和autorelease等操作,以增加或减少对象的引用计数。这样,开发人员可以集中精力于业务逻辑,而无需手动管理内存。
通过在运行期和编译期的结合作用,ARC简化了内存管理的过程,减少了手动管理内存的错误和工作量。它提供了自动化的内存管理机制,使开发人员能够更专注于应用程序的功能实现,提高了开发效率和代码质量

  • 除了会自动调用“保留”与“释放”方法外,使用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” 模式要快很多,并且实际上并不将对象放入自动释放池中。

工作原理

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山河丘壑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值