本文介绍: 一、产生背景ARC(Auto Reference Counting)技术苹果公司设计XCode Static Analysis静态分析工具)时产生的灵感,苹果公司想既然这个工具可以检测内存泄漏,那么应该可以帮助开发者做好内存管理工作。于是ARC在2011年iOS5发布时候就推出了。它在苹果文档中是这样介绍的:在Objective-C中采用ARC机制,让编译器来进行内管理。在新一代Apple LLVM 编译器设置ARC为有效状态,就无需再次键入retain或者release代码,这在

一、产生背景

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进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注