そのため、保持サイクルを作成せずに、またはプロパティまたはインスタンス変数が予測できないように設定されている可能性があるとコンパイラが不平を言うことなくCCNode
、カスタムクラスの子へのローカル参照を保持したいCCNode
nil
たとえば、このカスタムクラスで
@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];
wherebackground
とnode
は、シーンが置き換えられたときにメモリから解放されることはありません
プロパティ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
この場合、このアプローチは良いことですか?