【发布时间】:2012-09-29 22:10:27
【问题描述】:
我从未从事过非 ARC 项目。我刚刚在基于 ARC 的项目中遇到了一个僵尸。我发现是因为保留循环。我只是想知道什么是保留循环。可以
你能给我举一个保留周期的例子吗?
【问题讨论】:
-
由于保留循环,不会出现僵尸。
标签: objective-c xcode automatic-ref-counting retain-cycle
我从未从事过非 ARC 项目。我刚刚在基于 ARC 的项目中遇到了一个僵尸。我发现是因为保留循环。我只是想知道什么是保留循环。可以
你能给我举一个保留周期的例子吗?
【问题讨论】:
标签: objective-c xcode automatic-ref-counting retain-cycle
保留循环是对象A 保留对象B 和对象B 同时保留对象A 的情况*。这是一个例子:
@class Child;
@interface Parent : NSObject {
Child *child; // Instance variables are implicitly __strong
}
@end
@interface Child : NSObject {
Parent *parent;
}
@end
您可以在 ARC 中使用 __weak 变量或 weak 属性来修复“反向链接”,即指向对象层次结构中直接或间接父级的链接:
@class Child;
@interface Parent : NSObject {
Child *child;
}
@end
@interface Child : NSObject {
__weak Parent *parent;
}
@end
【讨论】:
什么是保留循环:当两个对象保持对彼此的引用并被保留时,它会创建一个保留循环,因为两个对象都试图相互保留,因此无法释放。
@class classB;
@interface classA
@property (nonatomic, strong) classB *b;
@end
@class classA;
@interface classB
@property (nonatomic, strong) classA *a;
@end
为避免使用 ARC 保留循环,只需使用 weak 引用声明其中一个循环,如下所示:
@property (nonatomic, weak) classA *a;
【讨论】:
foo.bar = bar; bar.foo = foo; 创建了一个保留循环,一个简单的foo.bar = baz; 会破坏它并且不会产生泄漏。正确的?这是我的理解。
这很快,但这里是 iOS 中保留周期的交互式演示:https://github.com/nickm01/RetainCycleLoggerExample
【讨论】: