0

私はcocos2dを使用してコードを書いています。割り当てたメモリをすべて解放したい。私は次のようにdeallocメソッドでそれを行いました。
私がリリースしたすべてのオブジェクトはインターフェイスファイルで宣言され、プロパティ(割り当て)が設定され、実装ファイルで合成されます。
allocメソッドを使用して次のように作成しました

self.PlayerA = [[CCSprite alloc] initWithFile:@" PlayerImage_01.png"];


-(void)dealloc
{
 int count , i ;

 count = [self.PlayerA retainCount];
 for(i = 0; i < count; i++)
   [self.PlayerA release];

 count = [self.targetLayer retainCount];
 for(i = 0; i < count; i++)
   [self.targetLayer release];

  count = [self.playerGunSlowDrawSheet retainCount];
 for(i = 0; i < count; i++)
    [self.playerGunSlowDrawSheet release];

 count = [self.playerGunSlowDrawAnimation retainCount];
 for(i = 0; i < count; i++)
    [self.playerGunSlowDrawAnimation release];

 count = [self.numberFinishedTime retainCount];
 for(i = 0; i < count; i++)
    [self.numberFinishedTime release];

 count = [self.backGroundImage retainCount];
 for(i = 0; i < count; i++)
   [self.backGroundImage release];

 [[CCTextureCache sharedTextureCache] removeAllTextures];
 [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];

 [super dealloc];
 }

しかし、私は次のようになっています。プログラム受信信号:「EXC_BAD_ACCESS」。デバッガーでは、[superdealloc]でエラーが表示されています。

私はメモリ管理で完全に間違っていますか?または私はこれで何かが欠けていますか?ありがとうございました。

4

1 に答える 1

1

はい、これはオブジェクトを解放するための良い方法ではありません。DeallocメソッドでオブジェクトAを複数回解放すると(保持カウントが1より大きい場合)、オブジェクトを使用している可能性のある他のオブジェクトの下からラグを引き出す可能性があります。

オブジェクトを所有している場合は、オブジェクトを1回だけ解放する必要があります(オブジェクトを1回だけ保持するか、自分で割り当てると仮定します)。

「所有する」オブジェクトの詳細については、次のAppleのメモリ管理プログラミングガイドを読むことをお勧めします。

http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

Objective-Cのメモリ管理の基本を理解したら、XCodeの[ビルド]メニューの[ビルドと分析]項目を使用すると、このような問題を見つけるのに役立ちます。

通常、deallocメソッドは次のようになります。

-(void) dealloc
{
    [self.objectA release];
    [self.objectB release];

    [super dealloc];
}

編集:EXC_BAD_ACCESSを取得する理由に関する元の質問に答えるには、理由を判断するための十分な情報がここにありません。考えられる理由の1つは、サブクラス内のオブジェクトの割り当てを解除し、スーパークラスのdeallocメソッドでも割り当て解除されている可能性があります。しかし、それは暗闇の中でのショットです

于 2010-06-22T10:06:46.617 に答える