objective c - كيفية الملكية عقد إشارة إلى عقد الأطفال مع أرك في Cocos2d




objective-c cocos2d-iphone (2)

تغيير الواجهة لاستخدام مرجع ضعيف الصفر:

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

إذا كانت عقدة الخلفية يلغي، سوف إيفار _background تصبح نيل تلقائيا. وبهذه الطريقة لن يكون لديك دورة الاحتفاظ بعد الآن. هذه هي الممارسة الجيدة عموما إذا قمت بتخزين مرجع عقدة في عقدة التي هي طفل أو حفيد العقدة لأن تلك الحالات سوف يسبب دائما دورة الاحتفاظ.

الشفرة كما يجب أن تعمل بشكل جيد مع إشارة ضعيفة.

لاحظ أن عليك أن تكون حذرا عند إنشاء وتعيين مرجع ضعيف، على سبيل المثال هذا سوف تفشل مع عقدة صفر التي تضاف كطفل:

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

المشكلة هنا هي أنه بعد التعيين، لا يوجد شيء بقوة عقد على عقدة الخلفية، لذلك ديالوكاتس ويتم تعيين إلى لا شيء قبل أدشيلد: الخط.

هناك حل بسيط:

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

بعد إضافة العقدة كطفل، سوف مجموعة الأطفال عقد إشارة قوية إلى العقدة. حتى بعد أدشيلد: خط يمكنك تعيين العقدة بغ مؤقتة إلى إيفار _background.

لدي فئة مخصصة 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

المشكلة هي أن هذا يسبب دورة الاحتفاظ على أرك مع خلفية عقدة أبدا يتم تحريرها من الذاكرة.


لا توجد قواعد صلبة لإدارة الذاكرة. تحتاج إلى النظر في التعليمات البرمجية الخاصة بك وتقرر أفضل طريقة للاستخدام.

في قضيتك على الرغم من أن لديك فقط من أي وقت مضى خلفية واحدة يمكن أن مجرد جعل تلك الممتلكات ضعيفة. Cocos2d يحمل إشارة قوية إلى جميع العقد التي هي في الرسم البياني المشهد لذلك سوف التمسك بها بالنسبة لك.

هذا لا يعني أنه يجب تخزين كل عقدة كما ضعيفة، وأحيانا تريد عقدة للتسكع إذا لم يكن في الرسم البياني المشهد.





retain-cycle