9

我从未从事过非基于 ARC 的项目。我刚刚在基于 ARC 的项目中遇到了一个僵尸。我发现这是因为保留周期。我只是想知道什么是保留周期。可以

你能给我一个保留周期的例子吗?

4

3 回答 3

24

保留循环是对象A保留对象的情况B,并且对象同时B保留对象*。这是一个例子:A

@class Child;
@interface Parent : NSObject {
    Child *child; // Instance variables are implicitly __strong
}
@end
@interface Child : NSObject {
    Parent *parent;
}
@end

__weak您可以通过使用“反向链接”的变量或属性来修复 ARC 中的保留周期weak,即指向对象层次结构中直接或间接父级的链接:

@class Child;
@interface Parent : NSObject {
    Child *child;
}
@end
@interface Child : NSObject {
    __weak Parent *parent;
}
@end


*这是最原始的保留循环形式;可能有一长串物体在一个圆圈中相互保留。

于 2012-10-09T14:38:52.640 回答
10

这是一个保留循环:当两个对象保持对彼此的引用并被保留时,它会创建一个保留循环,因为两个对象都试图相互保留,因此无法释放。

@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;
于 2012-10-09T14:37:40.673 回答
0

这很快,但这是 iOS 中保留周期的交互式演示:https ://github.com/nickm01/RetainCycleLoggerExample

于 2016-07-11T01:33:59.757 回答