0

そのため、保持サイクルを作成せずに、またはプロパティまたはインスタンス変数が予測できないように設定されている可能性があるとコンパイラが不平を言うことなくCCNode、カスタムクラスの子へのローカル参照を保持したいCCNodenil

たとえば、このカスタムクラスで

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

@implementation MyNode

+ (id)nodeWithBackground:(id)background {
    MyNode *node = [MyNode node];
    node.background = background;
    node.background.scale = 0.01;//(*)
    return node;
}

- (void)setBackground:(CCNode *)background {
    if (_background) {//(*)
        [self removeChild:_background];
    }
    if (background) {
        [self addChild:background];
    }
    _background = background;
}

@end

...このようなノードを作成する保持サイクルがあります

CCSprite *background = [CCSprite ...];
MyNode *node = [MyNode nodeWithBackground:background];
[self addChild:node];

wherebackgroundnodeは、シーンが置き換えられたときにメモリから解放されることはありません

プロパティbackgroundを weak に変更すると、上記のコードのアスタリスク (*) の付いた行で、コンパイラは、weak プロパティまたはインスタンス変数が予測不能に設定されている可能性があることを報告します。nil

アップデート:

これは、弱いインスタンス変数とセトラー メソッドとゲッター メソッドを使用する別のアプローチです。ローカルの強い変数 (*) は、メソッドが弱い ivar を使用する場合_background、コンパイラーが nil に設定されていると予測できない可能性があると文句を言うためです。

@interface MyNode : CCNode {
    __weak CCNode *_background;
}
+ (id)nodeWithBackground:(id)background;
- (void)setBackground:(CCNode *)background;
- (CCNode *)background;
@end

@implementation MyNode

+ (id)nodeWithBackground:(id)background {
    MyNode *node = [MyNode node];
    node.background = background;
    node.background.scale = 0.01;
    return node;
}

- (void)setBackground:(CCNode *)background {
    __strong CCNode *localRef = _background; //(*)
    if (localRef) {
        [self removeChild:localRef];
    }
    if (background) {
        [self addChild:background];
    }
    _background = background;
}

- (CCNode *)background {
    return _background;
}
@end

この場合、このアプローチは良いことですか?

4

0 に答える 0