通过父子建构保留周期

时间:2015-05-29 09:34:12

标签: ios objective-c memory-management memory-leaks retaincount

每个人都熟悉的常见问题,但我还是不完全理解。

如果对象A拥有(具有强大的属性)对象B,并且对象B具有对象A的强属性,则存在保留周期,并且不会释放任何对象并且存在内存泄漏。

但是,如果对象A将指向对象C而不是对象B,那么内存中的另一个地址会是什么呢?

据我所知,强大的属性做了类似的事情:

- (void)setObject:(id)newObject{
if (_newObject == newObject){
return; //
}

NSObject *oldObject = _newObject;
_newObject = [newObject retain];
[oldObject release];
}

那么,如果我们指向对象C,那么在那种情况下,对象B的内存是否会被释放呢?如果对象(A和B)将改为设置nil对象,该怎么办?是否仍会存在内存泄漏的保留周期?旧价值"浮动"在记忆的某个地方?

我知道,已经多次讨论过这个问题,但我仍然无法了解整个情况"在我的脑子里。如果有任何澄清,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

如果问题是“你可以通过重新分配其中一个属性来打破保留周期吗?”,答案是肯定的。如果您为属性指定nil,这同样适用。

答案 1 :(得分:2)

您正在寻找的词是“保留周期”。

最简单的保留周期是一个对自身有强烈引用的对象。非常罕见,因为它毫无意义。

最常见的情况是A具有对B和B的强引用,其具有对A.A-> B-> A的强引用。你看周期了吗?

该循环可以是任何长度A-> B-> C-> D-> E-> F-> G-> ...... - >。这是一个保留周期,因此不会释放任何内容。如果您只有A-> B-> C-> D-> ...... - > Z而没有参考序列中的另一个对象,那么就没有循环。没有循环,没问题。