objective c - कैसे संपत्ति को Cocos2d में एआरसी के साथ बच्चों के नोड्स के लिए एक संदर्भ पकड़




objective-c cocos2d-iphone (2)

मेरे पास कस्टम CCNode वर्ग है जिसमें बच्चों के नोड्स का एक समूह है, और मैं कुछ कस्टम बदलाव करने के लिए बच्चों के संदर्भों को रखना चाहता हूं

उदाहरण के लिए, बच्चे की पृष्ठभूमि के लिए कस्टम क्लास ऐसा दिखेगा:

@interface MyNode : CCNode
@property (nonatomic, strong) CCNode *background;
@end

@implementation
- (void)setBackground:(CCNode *)background {
    if (_background) {
        [self removeChild:_background];
    }
    if (background) {
        [self addChild:background];
    }
    _background = background;
}
- (void)runTransition {
    if (_background)
        [_background runAction:[…]];
}
@end

समस्या ये है कि यह एआरसी पर नोड पृष्ठभूमि के साथ बनाए रखने के चक्र को कभी स्मृति से मुक्त नहीं करता है


एक शून्यिंग कमजोर संदर्भ का उपयोग करने के लिए अपना इंटरफ़ेस बदलें:

@interface MyNode : CCNode
@property (nonatomic, weak) CCNode *background;
@end

यदि पृष्ठभूमि नोड को हटाया जाता है, तो _ बैकग्राउंड राइडर स्वचालित रूप से शून्य हो जाएगा इस तरह आपके पास फिर से बनाए रखने के चक्र नहीं होंगे। यह आम तौर पर अच्छा अभ्यास होता है यदि आप नोड के संदर्भ में नोड का संचय करते हैं जो नोड के एक बच्चे या पोते हैं क्योंकि उन स्थितियों में हमेशा एक बनाए रखने के चक्र का कारण होगा।

आपके कोड को कमजोर संदर्भ के साथ ठीक काम करना चाहिए।

हालांकि ध्यान दें कि आपको कमजोर संदर्भ बनाने और बनाने के लिए सावधान रहना होगा, उदाहरण के लिए यह एक नील नोड के रूप में जोड़ा जा रहा है जो बच्चे के रूप में जोड़ा जा रहा है:

_background = [CCNode node];
[self addChild:_background];

यहां समस्या यह है कि असाइनमेंट के बाद, पृष्ठभूमि नोड पर कोई असर नहीं पड़ता है, इसलिए यह deallocates और addChild से पहले शून्य पर सेट किया गया है: रेखा।

एक सरल समाधान है:

CCNode* bg = [CCNode node];
[self addChild:bg];
_background = bg;

नोड को बच्चे के रूप में जोड़ा जाने के बाद, बच्चों की सरणी नोड का एक मजबूत संदर्भ रखेगी। तो addChild के बाद: लाइन आप अस्थायी बीजी नोड को _background ivar पर असाइन कर सकते हैं।


स्मृति प्रबंधन के लिए कोई मुश्किल नियम नहीं हैं आपको अपने कोड को देखने और उपयोग करने के लिए सर्वोत्तम विधि तय करने की आवश्यकता है।

आपके मामले में हालांकि आपके पास केवल एक पृष्ठभूमि है, लेकिन आप उस संपत्ति को कमजोर कर सकते हैं। Cocos2d दृश्य ग्राफ़ में मौजूद सभी नोड्स के लिए एक मजबूत संदर्भ रखता है ताकि यह आपके लिए इसके लिए हो सके

इसका मतलब यह नहीं है कि हर नोड को कमज़ोर के रूप में संग्रहित किया जाना चाहिए, कभी-कभी आप नोड को घूमने के लिए चाहते हैं यदि दृश्य ग्राफ़ में नहीं।





retain-cycle