ios - 保留循环与父子构造

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

这是一个很常见的问题,每个人都很熟悉,但我仍然没有完全理解它。

如果对象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/

相关文章:

visual-studio - 如何增加 Visual Studio C++ 中的内存限制

IOS:正确的屏幕触摸次数

android - Sinch - Android 和 iOS 中的群发消息

ios - 将 Game Center 添加到游戏后第一次接触时 Spritekit 游戏场景停止

ios - CATransformLayer : changing property masksToBounds in transform-only layer, 将无效

objective-c - 在 UIImagePickerController 中点击使用后保存视频

objective-c - 在应用程序中创建一种导航逻辑 : how to?

ios - UITableView - 如何动态更新自调整大小单元格的框架

c++ - 弃用 std::allocator<void>

ios - 避免 UIImage 的 imageNamed - 内存管理