浅析ARC
2016-04-20 11:32
260 查看
简介
ARC是Automatic Reference Counting(自动引用计数器)的简称.ARC是ios5.0引入的新特性,完全消除手动管理内存的繁琐,编译器会自动在适合的代码里面插入适当的retain,release,autorelease的语句.我们不要再担心内存管理,因为编译器帮我们做了这一切.
ARC是编译器的特性,并非运行时的特性,也不是其他编程语言中的垃圾回收器.因此自动管理和手动管理内存其实一样的,但是自动管理更加快速,因为编译器执行某些优化.
编译器会为“拥有的”每一个对象插入相应的release语句。如果对象的所有权修饰符是__strong,那么它就是被拥有的。如果在某个方法内创建了一个对象,前端编译器会在方法末尾自动插入release语句以销毁它。而类拥有的对象(实例变量/属性)会在dealloc方法内被释放。事实上,你并不需要写dealloc方法或调用父类的dealloc方法,ARC会自动帮你完成一切。此外,由编译器生成的代码甚至会比你自己写的release语句的性能还要好,因为编辑器可以作出一些假设。在ARC中,没有类可以覆盖release方法,也没有调用它的必要。ARC会通过直接使用objc_release来优化调用过程。而对于retain也是同样的方法。ARC会调用objc_retain来取代保留消息。
ARC优化器负责移除多余的retain和release语句,确保生成的代码运行速度高于手动引用计数的代码。
原理
ARC的规则就是只要对象没有强指针引用,就会被释放掉,换而言之 只要还有一个强引用指针变量指向对象,那么这个对象就会存在内存中.弱指针指向的对象,会被自动变成空指针(nil指针),从而不会引发野指针错误.在项目中设置是否使用ARC
注意点
在ARC下,dealloc可以重写,但是不能调用[super dealloc]outlet的控件属性都是weak修饰,因为他们已经被父控件强引用.
ARC只对OC对象的进行内存管理,对于CoreFundation的api使用,他的对象所有权没有移交给OC对象管理,都需要手动去释放.
strong 相当于 MRC(Manual Reference Counting) 的 retain,大多修饰OC对象,
weak 相当于 MRC 的 assign 但是 在指向的对象被销毁的时候,指针会被设置成0,修饰代理
assign 如果是Objective C 对象,在没有特殊处理的时候,相当于strong,常用于修饰内置类型
在ARC下,一个block内引用一个对象的实例变量后,self会被retain,所以极易造成strong reference cycle,可以通过__weak指针来避免这种情形,__weak类型指针在所指向对象销毁后会自动置为nil,ARC不会为__weak指针retain(__weak id safeSelf = self)
__bridge : Objective-C 和 Core Foundation 之间的转换, 拥有权不变.
__bridge_retained : 从 Objective-C 到 Core Foundation 的转换,由程序员负责把得到的 CFxxxRef 销毁
__bridge_transfer : 从 Core Foundation 到 Objective-C 的转换,由ARC负责把得到的 id 销毁
Core Foundation类型的对象仍然可以用CFRetain,CFRelease这些方法
不能再使用NSAllocateObject和NSDeallocateObject对象
不能以new为开头给一个属性命名
不能在C结构体中使用对象指针,如果有类似功能可以创建一个Objective-C类来管理这些对象
不能再使用NSAutoreleasePool对象,ARC提供了@autoreleasepool块来代替它,这样更有效率
不能使用内存存储区(不能再使用NSZone)
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 浅谈汇编器、编译器和解释器
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- 让我们做个简单的解释器(三)
- 让我们做个简单的解释器(一)
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 用 350 行代码从零开始,将 Lisp 编译成 JavaScript
- Lua的内存管理浅析
- 跟我学习JScript的Bug与内存管理
- 跟我学习javascript的垃圾回收机制与内存管理
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略