0

自動解放されたオブジェクト(self.graphicsContainer)を解放しないと、メモリリークが発生するcocos2dクラスがあります。コード:

@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];
}

なぜ私がそれを解放しなければならないのか誰かが知っていますか?私の知る限り、自動解放されたオブジェクトを解放するべきではありませんか?

4

1 に答える 1

1

それはまさに私がそのコードに期待する振る舞いです。graphicsContainerは保持されたプロパティであるため、行

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

...ノードは保持されるため、実行中にdeallocで解放する必要があります。基本的に、そこで行っていることには何の問題もありません。

注意点:おそらく物議を醸すかもしれませんが、さまざまな理由から、initとdeallocでプロパティアクセサーを使用することは一般的に嫌われています。 このSOの質問には、それに関する詳細情報があります(さらに良いのは、 Mike Ashの主題に関する優れた分析を読んでください)。

「init/deallocのプロパティアクセサーが悪い」キャンプに陥った場合(私はそうです)、次のように変更できます。

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

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

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

于 2012-05-05T01:05:08.833 に答える