保留ARC中的循环

时间:2012-10-09 14:34:03

标签: objective-c xcode automatic-ref-counting retain-cycle

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

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

3 个答案:

答案 0 :(得分:23)

保留周期是对象A保留对象B,对象B同时保留对象A的情况 * 。这是一个例子:

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

您可以使用__weak变量或“{1}}属性为您的”反向链接“修复ARC中的保留周期,即指向对象层次结构中的直接或间接父项的链接:

weak

<小时/> * 这是保留周期的最原始形式;可能存在一长串的物体彼此保持在一个圆圈中。

答案 1 :(得分:10)

以下是保留周期:当2个对象保持对彼此的引用并保留时,它会创建一个保留周期,因为两个对象都试图相互保留,从而无法释放。

@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;

答案 2 :(得分:0)

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