这是一个很常见的问题,每个人都很熟悉,但我仍然没有完全理解它。
如果对象A拥有对象B(拥有对象B的强属性),而对象B拥有对象A的强属性,则存在retain cycle,无法释放任何对象,存在内存泄漏。
但是,如果对象 A 将指向对象 C 而不是对象 B,从而指向内存中的另一个地址怎么办?
据我所知,strong 属性的作用如下:
- (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/