2012-10-09 13 views
9

में साइकिल को बनाये रखें मैं गैर एआरसी आधारित परियोजना पर काम कभी नहीं किया है। मैं बस अपने एआरसी आधारित परियोजना पर एक ज़ोंबी में आया था। मैंने पाया यह क्योंकि बनाए रखने cycle.I सिर्फ एक को बनाए रखने है cycle.Canएआरसी

तुम मुझे चक्र को बनाए रखने के लिए एक उदाहरण देता हूँ सकता है सोच रहा हूँ की थी?

+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 गुण का उपयोग करके एआरसी में चक्र को बनाए रखने ठीक कर सकते हैं, यानी लिंक निर्देशित करने के लिए या किसी वस्तु पदानुक्रम में अप्रत्यक्ष माता-पिता:

@class Child; 
@interface Parent : NSObject { 
    Child *child; 
} 
@end 
@interface Child : NSObject { 
    __weak Parent *parent; 
} 
@end 
यहाँ एक उदाहरण है


* यह एक सतत चक्र का सबसे आदिम रूप है; ऑब्जेक्ट्स की एक लंबी श्रृंखला हो सकती है जो एक दूसरे को एक सर्कल में बरकरार रखती है।

+2

क्या बनाए रखा चक्र एआरसी में स्मृति रिसाव का कारण बन जाएगा? – Raj

+0

@राज बिल्कुल! चक्र बनाए रखें एआरसी-विशिष्ट नहीं हैं, वे एआरसी और गैर-एआरसी परिदृश्य दोनों में स्मृति रिसाव का कारण बनेंगे। – dasblinkenlight

+0

हम उन्हें स्मृति रिसाव के कारण से बच सकते हैं क्योंकि मैंने @ साइमन_ जर्मैन के जवाब में टिप्पणियों में समझाया है। – trss

9

यहाँ एक चक्र को बनाए रखने है: 2 वस्तुओं एक दूसरे के लिए एक संदर्भ रखने के लिए और बनाए रखा जाता है, तो इससे एक चक्र को बनाए रखने के बाद से दोनों वस्तुओं एक दूसरे को बनाए रखने की कोशिश, यह असंभव जारी करने के लिए कर रही है बनाता है।

@class classB; 

@interface classA 

@property (nonatomic, strong) classB *b; 

@end 


@class classA; 

@interface classB 

@property (nonatomic, strong) classA *a; 

@end 

एआरसी के साथ चक्र को बनाए रखने के लिए, बस एक weak संदर्भ में उनमें से एक की घोषणा, इसलिए तरह से बचने के लिए:

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

रिलीज करने के लिए असंभव है? अगर हम चेन को तोड़ने वाले उन गुणों में से किसी एक के लिए किसी अन्य ऑब्जेक्ट को दोबारा सौंपने के लिए सावधान हैं तो इसे जारी किया जा सकता है? मैं विशेष रूप से पूछ रहा हूं क्योंकि मैंने कई बार रिलीज करना असंभव सुना है। – trss

+0

शीर्षक "चक्र को बनाए रखने के नियम # 4 से बचना: का उपयोग करें" http://www.cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html पर बंद "तरीकों चक्र को तोड़ने के लिए" पुष्टि करते हैं कि लगता है चक्र बनाए रखने के लिए संभव है। यह निश्चित रूप से बचने के लिए बेहतर है, लेकिन जहां यह जटिलता बनाता है अन्यथा, इसका उपयोग अभी भी किया जा सकता है लेकिन स्मृति मेमोरी बनाने से पहले इसे तोड़ने की देखभाल के साथ, इस प्रकार रिसाव से परहेज किया जाता है। – trss

+0

असंभव हो सकता है थोड़ा अतिरंजित हो सकता है, लेकिन चलो बस कहना कि यह बिल्कुल तुच्छ नहीं है। कुछ भी असंभव नहीं है। –