这是每个人都熟悉的非常普遍的问题,但我仍然不太了解。
如果对象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
对象怎么办?还有内存泄漏的保留周期吗?旧值“浮动”在内存中的某个地方吗?我知道,这已经讨论了很多次了,但是我仍然无法完全理解。我希望对此事作出任何澄清。
最佳答案
您要查找的单词是“保留周期”。
最简单的保留周期将是一个对其自身有很强引用的对象。非常罕见,因为它毫无意义。
最常见的情况是A对B有很强的引用,而B对A有很强的引用。A-> B-> A。你看到周期了吗?
循环可以是任意长度A-> B-> C-> D-> E-> F-> G-> ...-> A。这是一个保留周期,因此不会释放任何内容。如果只有A-> B-> C-> D-> ...-> Z,而没有引用序列中的另一个对象,则没有循环。没有周期,没有问题。
关于ios - 保持亲子结构的周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30526066/