2012-10-09 31 views
9

Tôi chưa bao giờ làm việc trên dự án dựa ARC phi. Tôi chỉ gặp một zombie trong dự án dựa trên ARC của tôi. Tôi thấy đó là do giữ cycle.I chỉ cần tự hỏi những gì là một giữ cycle.CanGiữ lại Cycle trong ARC

Ông có thể cho tôi một ví dụ cho duy trì chu kỳ?

+4

Một zombie không xảy ra vì của một chu kỳ giữ lại. – bbum

Trả lời

22

Một duy trì chu kỳ là một tình huống khi đối tượng A giữ đối tượng B, và đối tượng B giữ đối tượng A cùng lúc *. Dưới đây là một ví dụ:

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

Bạn có thể sửa chữa một giữ lại chu kỳ trong ARC bằng cách sử dụng __weak biến hoặc weak thuộc tính cho "liên kết trở lại" của bạn, tức là liên kết trực tiếp hoặc cha mẹ gián tiếp trong một hệ thống phân cấp đối tượng:

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


* Đây là hình thức nguyên thủy nhất của chu kỳ lưu giữ; có thể có một chuỗi dài các vật thể giữ lại nhau trong một vòng tròn.

+2

Chu trình giữ lại có gây rò rỉ bộ nhớ trong ARC không? – Raj

+0

@Raj Tuyệt đối! Các chu kỳ lưu giữ không phải là ARC cụ thể, chúng sẽ gây rò rỉ bộ nhớ trong cả hai trường hợp ARC và không phải ARC. – dasblinkenlight

+0

Chúng tôi có thể tránh chúng gây ra rò rỉ bộ nhớ như tôi đã giải thích trong phần bình luận cho câu trả lời của @ Simon_Germain. – trss

9

Đây là những gì một giữ lại chu kỳ là: Khi 2 đối tượng giữ một tham chiếu đến nhau và được giữ lại, nó tạo ra một chu kỳ giữ lại vì cả hai đối tượng cố gắng giữ lại nhau, làm cho nó không thể phát hành.

@class classB; 

@interface classA 

@property (nonatomic, strong) classB *b; 

@end 


@class classA; 

@interface classB 

@property (nonatomic, strong) classA *a; 

@end 

Để tránh giữ lại chu kỳ với ARC, đơn giản tuyên bố một trong số họ với một tham chiếu weak, như vậy:

@property (nonatomic, weak) classA *a; 
+0

Không thể phát hành? Nó có thể được phát hành nếu chúng ta cẩn thận để gán lại một số đối tượng khác cho một trong những thuộc tính phá vỡ chuỗi phải không? Tôi đặc biệt yêu cầu bởi vì tôi đã nghe không thể phát hành nhiều lần. – trss

+0

Tiêu đề "Tránh quy tắc lưu giữ chu kỳ # 4: sử dụng các phương pháp" đóng "để ngắt chu kỳ" tại http://www.cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html dường như xác nhận rằng nó có thể phá vỡ chu kỳ giữ lại. Nó chắc chắn là tốt hơn để tránh nhưng mà nó tạo ra sự phức tạp nếu không, nó vẫn có thể được sử dụng nhưng với sự quan tâm để phá vỡ nó trước khi họ tạo ra một rò rỉ bộ nhớ, do đó tránh rò rỉ. – trss

+0

Impossible có thể được một chút phóng đại, nhưng chúng ta hãy chỉ nói rằng đó là không chính xác tầm thường. Không có gì là không thể. –

Các vấn đề liên quan