2012-10-09 112 views
9

我從來沒有在基於非ARC的項目上工作過。我剛剛在基於ARC的項目中遇到了殭屍。我發現這是因爲保留週期。我只是想知道什麼是保留週期。可以在ARC中保留週期

您能給我一個保留週期的例子嗎?

+4

殭屍不會因爲保留週期的發生。 – bbum

回答

22

甲保留週期是一個情況時對象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

9

下面是一個保留週期:當兩個對象保持彼此間的引用並被保留時,它會創建一個保留週期,因爲兩個對象都試圖保留對方,從而無法釋放。

@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

不可能有點誇張,但我們只是說它不是微不足道的。沒有什麼是不可能的。 –