保留循环与父子构造

Retain cycle with parent-child construction

很常见的问题,大家都很熟悉,但我还是没完全理解。

如果对象A拥有(强属性的)对象B,且对象B拥有对象A的强属性,则存在retain cycle,无法释放对象存在内存泄漏。

但是,如果对象 A 将指向对象 C 而不是对象 B,从而指向内存中的另一个地址怎么办?

据我所知,强属性的作用如下:

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

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

那么,如果我们改为指向对象 C,那么对象 B 的内存是否会被释放?如果两个对象(A 和 B)都改为设置 nil 对象怎么办?还会有内存泄漏的保留周期吗?旧值 "floating" 在内存中的某处?

我知道,这已经讨论过很多次了,但我仍然无法理解 "whole picture"。我将不胜感激有关此事的任何澄清。

您要找的词是"retain cycle"。

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

最常见的情况是A强引用B,B强引用A。A->B->A。你看到循环了吗?

循环可以任意长度A->B->C->D->E->F->G->...->A。这是一个保留周期,所以不会释放任何东西。如果你只有 A->B->C->D->...->Z 而没有引用回序列中的另一个对象,那么就没有循环。没有循环,没有问题。

如果问题是"can you break a retain cycle by reassigning one of the properties?",答案是肯定的。如果您将 nil 分配给 属性.

,这同样适用