2012-10-09 19 views
9

ARC tabanlı olmayan projelerde hiç çalışmadım. ARC tabanlı projemde bir zombiye rastladım. Döngüsünü koruduğumun farkına vardım. Sadece bir tutma döngüsünün ne olduğunu merak ediyorum.CanARC İçinde Döngüyü Koru

Bana tutma döngüsü için bir örnek verebilir misiniz?

+4

Bir zombi nedeniyle korumak döngüsünün oluşmaz. – bbum

cevap

22

bir nesne AB nesne koruduğunda döngüsü bir durum korumak ve B nesne: sadece bu kadar gibi, bir weak referansla bunlardan biri ilan, ARC ile döngüleri muhafaza önlemek için

@class classB; 

@interface classA 

@property (nonatomic, strong) classB *b; 

@end 


@class classA; 

@interface classB 

@property (nonatomic, strong) classA *a; 

@end 

A nesnesini aynı anda * numaralı telefonu korur.

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

Bir senin "geri bağlantıları" için __weak değişkenleri veya weak özelliklerini kullanarak ARC içinde döngüsünü korumak çözebilirsiniz, yani bir nesne hiyerarşi içinde doğrudan bağlantılar veya dolaylı ebeveynler:

@class Child; 
@interface Parent : NSObject { 
    Child *child; 
} 
@end 
@interface Child : NSObject { 
    __weak Parent *parent; 
} 
@end 
İşte bir örnek


* Bu, tutma döngüsünün en ilkel şeklidir; Birbirini bir daire içinde tutan uzun bir nesne zinciri olabilir.

+2

Saklama döngüsü, ARC'de bellek sızıntısına neden olur mu? – Raj

+0

@Raj Kesinlikle! Koruma döngüleri ARC'ye özgü değildir, ARC ve ARC dışı senaryolarda bellek sızıntılarına neden olurlar. – dasblinkenlight

+0

@ Simon_Germain'in yanıtına yorumlarda açıkladığım gibi, bunların bellek sızıntılarına neden olmasını önleyebiliriz. – trss

9

Bir muhafaza döngüsü şu şekildedir: İki nesne birbirine referans tuttuğunuzda ve saklandıklarında, her iki nesne birbirini tutmaya çalıştığı ve bırakmanın imkansız hale gelmesi nedeniyle bir tutma döngüsü oluşturur.

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

Yayınlanması imkansız mı? Zinciri bozan bu özelliklerden biri için başka bir nesneyi yeniden atamaya özen gösterirsek serbest kalabilir. Özellikle soruyorum çünkü birçok kez serbest bırakmanın imkansız olduğunu duydum. – trss

+0

"Devreye girme döngülerini engelle # 4: döngüleri kesmek için" yakın "yöntemleri kullanın" başlığı http://www.cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html tutma döngülerini kırmak mümkündür. Bundan kaçınmak kesinlikle daha iyidir, ancak karmaşıklık yarattığı yerde, yine de kullanılabilir, ancak bellek sızıntısı yaratmadan önce kırılmaya özen gösterilerek, sızıntıdan kaçınılabilir. – trss

+0

İmkansız biraz abartılmış olabilir, ama sadece tam olarak önemsiz değil diyelim. Hiçbir şey imkansız değildir. –