2012-05-04 9 views
0

自動解放されたオブジェクト(self.graphicsContainer)をリリースしないと、メモリリークを引き起こすcocos2dクラスがあります。コード:クラスプロパティのiOS用メモリリークを回避する方法

@property (nonatomic, retain) CCNode * graphicsContainer; // I create property 

@synthesize graphicsContainer = _graphicsContainer; // I synthesize it 

-(id)init 
{ 
    if ((self = [super init])) { 
     self.graphicsContainer = [CCNode node]; // which returns autoreleased object! 
    } 
    return self; 
} 

-(void) dealloc 
{ 
    [self.graphicsContainer release]; // If I do not release it I get memory leak warning! 
    [super dealloc]; 
} 

なぜ私はそれをリリースしなければならないのですか?私が知る限り、オートレリースされたオブジェクトをリリースすべきではありませんか?

+0

このコードはバックグラウンドスレッドで実行されていますか? – MByD

+0

このコードはメインレイヤーとメインシーンのinit内部にあります。スレッドはありません.. – knagode

答えて

1

これはまさに私がそのコードから期待している動作です。 graphicsContainerが保有財産であるため、ライン

self.graphicsContainer = [CCNode node]; // which returns autoreleased object! 

は...ノードが保持されますので、あなたは、あなたがやっているようにdeallocでそれを解放する必要があります。基本的にあなたが行っていることに間違いはありません。

警告:多分議論の余地がありますが、いろいろな理由から、initとdeallocでプロパティアクセサーを使用することは一般的に嫌われています。 This SO questionにそれに関する情報があります(さらに良い:件名のMike Ash's excellent analysisを読んでください)。 (私は)キャンプ「悪いのinit /のdeallocでプロパティアクセサ」、あなたはこれにそれを変更することができ

あなたはに陥る場合:

-(id)init 
{ 
    if ((self = [super init])) { 
     _graphicsContainer = [[CCNode node] retain]; // which returns autoreleased object! 
    } 
    return self; 
} 

-(void) dealloc 
{ 
    [_graphicsContainer release]; 
    [super dealloc]; 
} 

上記のコードは、あなたがしているものとまったく同じですそれはプロパティアクセサーを呼び出さないことを除いて、実行します。

関連する問題