本文出处:http://www.onevcat.com/2012/06/arc-hand-by-hand/
1,什么是ARC?
Automatic Reference Counting,自动引用计数。ARC是LLVM3.0编译器的特性。ARC开启时,编译器会自动在代码合适的地方插入retain,release,autorelease,因此代码中永远不用下retain,release,autorelease了。
2,ARC工作原理
先来介绍下Munaral Reference Counting(MRC)手动引用计数的原理:如果需要持有一个对象,那么对其发送retain,如果之后不再使用该对象,那么对其release或autorelease。每一次对retain,new,alloc的调用,都需要对其进行release或者autorelease。
其次,ARC的优越性:arc是Object-C编译器的特性,而不是运行时特性或者垃圾回收机制。arc所做的只不过是在代码编译时在合适的位置适当地插入release或autorelease,就如同之前MRC所做的那样,所以在效率上至少不会比MRC低。
3,ARC机制
ARC的基本机制是只要某个指针被strong指针所指向,那么它就不会被销毁,只要对象没有被任何指针所指向,那么就将销毁。在默认情况下,所有的实例变量和局部变量都是strong类型的,它和mrc情况下,retain的property属性是相似的。
比如NSString *firstName = self.textField.text;用字符串@“oneV”做为例子。显然这时
两个strong指针同时指向一个对象。如果这时用户在textField里输入了@“oneCat”,那么此时
其中一个strong指针指向了另一个对象。只有当firstName指针也被指向了另一个对象,或者超出了作用范围的空间,那么此时firstName指针也不再持有@“oneV”。在ARC下这种情况发生后,@“oneV”这个对象就会被销毁。
没有strong指针指向,内存释放。
相反,如果是weak指针,那么该指针并不持有该对象。
_weak NSString *weakName = self.textField.text;
得到的指向关系是
一个strong和一个weak指针指向了同一个对象。
如果textField内容改变的话,那么@“oneV”这个对象将被销毁。同时,在arc机制下,所有指向这个对象的weak指针将被置为nil。
所以在arc机制下,所有的strong和weak指针都不会指向一个dealloced的对象,从根源上解决了意外释放导致的crash。
strong指针指向另外对象,对象被释放,weak自动置为nil.
4,避免循环持有的问题。如delegate设计模式。
viewController有一个strong指针指向UITableView,而UITableView的datasource和delegate都是指向UITableView的weak指针。