Tar*_*riq 52 memory-management objective-c ios automatic-ref-counting retain-cycle
假设我们有三个对象:祖父母,父母和孩子.祖父母保留父母,父母保留孩子,孩子保留父母.祖父母释放父母.
在这种情况下会发生什么?
rma*_*ddy 71
除非对父母或孩子有其他提及,否则他们都会成为孤儿.但是父母和孩子之间的保留周期阻止了被释放并且它们变成浪费的记忆.
孩子不应该留住父母.如果有的话,在子代中使用弱引用来维护对父代的引用.
小智 26
保留周期是条件当2个对象保持彼此的引用并被保留时,它会创建一个保留周期,因为两个对象都试图相互保留,从而无法释放.
这里"祖父母"保留"父母","父母"保留"孩子",其中"孩子"保留"父母".这里在父母和孩子之间建立保留周期.释放祖父母后,父母和子女都成为孤儿,但父母的保留计数不会为零,因为儿童会保留父母,因此会导致记忆管理问题.
有两种可能的解决方案:
1)使用指向父对象的弱指针,即子对象应该使用对父对象的弱引用,而不保留对父对象的弱引用.
2)使用"关闭"方法来打破保留周期.
http://www.cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html
RMD*_*per 10
在一个简单的例子中,考虑两个对象A和B,其中A创建并保留B.当创建A时,它创建B.当创建A的人最终释放它时,A的保留计数降为零并且它被取消分配.如果A的dealloc方法调用B上的释放,则B的保留计数也会降为零,并且它也会被释放.[这假设没有其他人保留A或B,因为我保持简单.]
但是如果B需要一个回到A的引用会发生什么呢?它会保留A?创建A的人可能会释放它.但由于B也保留了A,A的保留计数不会归零.同样,由于A保留B,因此B的保留计数也不会为零.两者都不会被解除分配.即使B在其自己的dealloc中调用A的释放方法也没关系,因为该方法永远不会被调用.
此时您有内存泄漏,因为即使它们仍然存在,您也没有对A或B的任何引用.如果A或B正在执行任何处理器密集型操作,那么您可能还会将CPU时间泄漏到不需要的对象.
在你的情况下,A是父母,B是孩子,无论谁创造A是祖父母.
保留周期是当对象A保留对象B时发生的循环,而对象B保留对象A.在这种情况下,如果释放了任一对象:
因此,这两个对象只会在程序的生命周期中徘徊,即使它们应该,如果一切正常,也应该被释放.
| 归档时间: |
|
| 查看次数: |
35551 次 |
| 最近记录: |