保留ARC中的循环

Raj*_*Raj 9 xcode objective-c automatic-ref-counting retain-cycle

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

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

das*_*ght 23

甲保留周期是一个情况时对象A保留对象B,和对象B保留对象A在同一时间*.这是一个例子:

@class Child;
@interface Parent : NSObject {
    Child *child; // Instance variables are implicitly __strong
}
@end
@interface Child : NSObject {
    Parent *parent;
}
@end
Run Code Online (Sandbox Code Playgroud)

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

@class Child;
@interface Parent : NSObject {
    Child *child;
}
@end
@interface Child : NSObject {
    __weak Parent *parent;
}
@end
Run Code Online (Sandbox Code Playgroud)


*这是保留周期最原始的形式; 可能存在长链对象,它们彼此保持在一个圆圈中.

  • 保留周期是否会导致ARC内存泄漏? (2认同)

Sim*_*ain 10

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

@class classB;

@interface classA

@property (nonatomic, strong) classB *b;

@end


@class classA;

@interface classB

@property (nonatomic, strong) classA *a;

@end
Run Code Online (Sandbox Code Playgroud)

要避免使用ARC保留周期,只需使用weak引用声明其中一个,如下所示:

@property (nonatomic, weak) classA *a;
Run Code Online (Sandbox Code Playgroud)