一.ARC是如何工作的
你可能已经适应了手动管理内存的分配与回收。它的原理是这样的:当你需要在内存中保持一个对象,那么你需要retain它,除非它已经被自动retain了。当你不再使用一个对象时,你需要release它,除非它已经被autorelease掉了。
这种手动管理内存的方式虽然不难,但是非常容易出错。无论是你多次的release了某对象,还是你的变量指向了一个不在存在的数据,或者是由于你没有release掉足够多的对象导致内存耗尽,都会造成程序的crash。
虽然静态分析工具staticanalyze在寻找错误方面有帮助,但是ARC做的更加出色。它通过在编译阶段,而不是程序运行时,在程序的适当位置添加retain或release方法来帮你管理内存。
二.strong指针保存了对象的生命
ARC的新规则非常简单,你需要做的只是将指针指向对象。只要还有strong类型的指针指向对象,这个对象就不会被释放。当指向这个对象的指针指向了其他对象或者被释放,这个对象就会被释放掉。这个规则对于实例变量,属性,甚至是局部变量都是适用的。
firstName与self.textField.text都指向同样的string对象。该string对象保存了用户的一段文本输入。
当用户改变了文本,则self.textField.text指向新的string对象“Rayman”。但firstName仍然指向之前的string对象“Ray”。所以string对象“Ray”依然有指针指向它,因此它不会被释放。
但是当firstName指向一个新的对象时,string对象“Ray”由于没有任何strong类型的指针指向它,它就被释放掉了。
三.Weak指针不能保持对象的生命
weakName是指向string对象“Rayman”的weak指针。
当string对象“Rayman”没有strong类型的指针指向它时,它被释放掉。同时,指向它的weak指针weakName也会被设置为nil。
Weak指针主要用于存在父子关系的两个对象中,以避免相互retain造成二者都无法被释放的retain cycle出现。
你可能已经适应了手动管理内存的分配与回收。它的原理是这样的:当你需要在内存中保持一个对象,那么你需要retain它,除非它已经被自动retain了。当你不再使用一个对象时,你需要release它,除非它已经被autorelease掉了。
这种手动管理内存的方式虽然不难,但是非常容易出错。无论是你多次的release了某对象,还是你的变量指向了一个不在存在的数据,或者是由于你没有release掉足够多的对象导致内存耗尽,都会造成程序的crash。
虽然静态分析工具staticanalyze在寻找错误方面有帮助,但是ARC做的更加出色。它通过在编译阶段,而不是程序运行时,在程序的适当位置添加retain或release方法来帮你管理内存。
二.strong指针保存了对象的生命
ARC的新规则非常简单,你需要做的只是将指针指向对象。只要还有strong类型的指针指向对象,这个对象就不会被释放。当指向这个对象的指针指向了其他对象或者被释放,这个对象就会被释放掉。这个规则对于实例变量,属性,甚至是局部变量都是适用的。
![](http://static.oschina.net/uploads/img/201305/02213424_ccmj.jpg)
firstName与self.textField.text都指向同样的string对象。该string对象保存了用户的一段文本输入。
![](http://static.oschina.net/uploads/img/201305/02213424_ihDX.jpg)
当用户改变了文本,则self.textField.text指向新的string对象“Rayman”。但firstName仍然指向之前的string对象“Ray”。所以string对象“Ray”依然有指针指向它,因此它不会被释放。
![](http://static.oschina.net/uploads/img/201305/02213424_9yyf.jpg)
但是当firstName指向一个新的对象时,string对象“Ray”由于没有任何strong类型的指针指向它,它就被释放掉了。
三.Weak指针不能保持对象的生命
![](http://static.oschina.net/uploads/img/201305/02213424_9V03.jpg)
weakName是指向string对象“Rayman”的weak指针。
![](http://static.oschina.net/uploads/img/201305/02213424_f23z.jpg)
当string对象“Rayman”没有strong类型的指针指向它时,它被释放掉。同时,指向它的weak指针weakName也会被设置为nil。
Weak指针主要用于存在父子关系的两个对象中,以避免相互retain造成二者都无法被释放的retain cycle出现。