在ARC中保留周期

问题描述:

我从来没有在基于非ARC的项目上工作过。我刚刚在基于ARC的项目中遇到了僵尸。我发现这是因为保留周期。我只是想知道什么是保留周期。可以在ARC中保留周期

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

+4

僵尸不会因为保留周期的发生。 – bbum

甲保留周期是一个情况时对象A保留对象B和对象B同时保留对象A*。这里有一个例子:

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

您可以修复使用__weak变量或weak属性你的“反向链接”保留ARC周期,即链接直接或对象层次间接父母:

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


*这是保留周期最原始的形式;可能会有一连串的物体互相留在一个圈内。

+2

保留周期会导致ARC中的内存泄漏吗? – Raj

+0

@Raj绝对!保留周期不是ARC特定的,它们会在ARC和非ARC场景中导致内存泄漏。 – dasblinkenlight

+0

我们可以避免它们造成内存泄漏,正如我在@ Simon_Germain的回答中所解释的那样。 – trss

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

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

不可能发布?如果我们仔细地为其中一个打破链条的属性重新分配一些其他对象,它会被释放吗?我特别要求,因为我听说不可能发布很多时间。 – trss

+0

在http://www.cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html上标题为“避免保留周期规则#4:使用”关闭“方法来打破周期”似乎证实了这一点有可能破坏保留周期。避免这种情况绝对会更好,但如果它造成了复杂性,它仍然可以使用,但在创建内存泄漏之前要小心打破它,从而避免泄漏。 – trss

+0

不可能有点夸张,但我们只是说它不是微不足道的。没有什么是不可能的。 –

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