一、产生背景
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的代码是几乎毫无差异的。
原文地址:https://blog.csdn.net/fang20180409/article/details/122981367
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_29284.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!