iOS开发中ARC的本质

一、产生背景

ARC(Auto Reference Counting)技术是苹果公司在设计XCode Static Analysis(静态分析工具)时产生的灵感,苹果公司想既然这个工具可以检测到内存泄漏,那么应该也可以帮助开发者做好内存管理工作。于是ARC在2011年iOS5发布的时候就推出了。它在苹果文档中是这样介绍的:

在Objective-C中采用ARC机制,让编译器来进行内存管理。在新一代Apple LLVM 编译器中设置ARC为有效状态,就无需再次键入retain或者release代码,这在降低程序崩溃、内存泄漏等风险的同时,很大程度上减小了开发程序的工作量。编译器完全清楚目标对象,并能立刻释放那些不再被使用的对象。如此一来,应用程序将具有可预测性,且能流畅运行,速度也将大幅度提升。

二、工作原理

在ARC有效的情况下,开发人员可以在编写Objective-C代码的时候,不用再键入以下几个方法:

- (instancetype)retain OBJC_ARC_UNAVAILABLE;
- (oneway void)release OBJC_ARC_UNAVAILABLE;
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE;
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;

程序在编译时会自动的插入该代码,并且ARC增加了三个关键字:

__strong: 赋值给这个变量的对象会自动被retain一次,如果在block中引用它,block也会retain它一次。

__unsafe_unretained: 赋值给这个变量不会被retain,也就是说被他修饰的变量的存在不能保证持有对象的可靠性,它可能已经被释放了,而且留下了一个不安全的指针。不会被block retain。

 __week:类似于__unsafe_unretained,只是如果所持有的对象被释放后,变量会自动被设置为nil,这样更安全些,不过只在IOS5.0以上的系统支持,同样不会被block retain。

__strong是系统默认行为,在对象被其他指针持有的时候,就会默认retain一次。如果不想要这个默认操作,可以显示地在指针变量前面加上__unsafe_unretained或者__weak关键字。而且ARC行为只对Objective-C代码代码有效,如果是要调用C/C++函数,内存管理还是必须得开发人员自己来处理。

三、行为验证 

前面说过ARC是在程序编译时就自动加入了内存管理代码,那么我们来通过一小段代码验证一下

 ARC:

 MRC:

 打开汇编选项:Debug --> Debug Workflow --> Always Show Disassembly.

然后通过断点比较两边的汇编代码(左:MRC,右:ARC)可以看出,两边都有objc_retain方法,由此可以得出一个结论,那就是ARC技术确实是在编译时期而并非运行时就已经做好了内存管理操作,所以在编译之后ARC和MRC的代码是几乎毫无差异的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星仔20180409

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

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

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

打赏作者

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

抵扣说明:

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

余额充值