2012-01-03 8 views
1

コードは次のとおりです。iOS:なぜこのインスタンスの割り当てが解除されましたか?

if(!spriteInfoBack){ 
     spriteInfoBack = [CCSprite spriteWithFile:@"bg_player.png"]; 
     [spriteInfoBack setAnchorPoint:CGPointMake(0, 1)]; 
     [spriteInfoBack setPosition:CGPointMake(infoLeftX, infoTopY)]; 
     [parent addChild:spriteInfoBack]; 
}else{ 
     [spriteInfoBack setPosition:CGPointMake(infoLeftX, infoTopY)]; 
} 

クラッシュ出力は次のようになります。

[CCSprite setPosition:]: message sent to deallocated instance 0xc59cc70 

、それは、このライン上に配置されていますので、もし(私はそれが奇妙だと思う

[spriteInfoBack setPosition:CGPointMake(infoLeftX, infoTopY)]; 

!spriteInfoBack)は、インスタンスの割り当てが解除されているかどうかをチェックしています。

+0

スタックトレースを提供できますか? –

答えて

1

CCSpriteを保持する必要があります。クラスメソッドspriteWithFileは、自動解放されたオブジェクトを返します。 spriteInfoBackに保存されている戻り値はあなたが所有していません。つまり、オブジェクトのライフタイムは、次の自動解放プールが空になるまでです。あなたのコードから、spriteInfoBackを怠惰に初期化し、後で使用するものとして使用しているようです。

spriteInfoBack = [[CCSprite spriteWithFile:@"bg_player.png"] retain]; 

そして、あなたはspriteInfoBackを解放する必要がありますいくつかの将来の時点で:何がしたいだろうと、そのようspriteWithFileの戻り値を保持しています。クラスの残りの部分は表示されませんが、spriteInfoBackがクラスのインスタンス変数である場合は、deallocでこれを行うと意味があります。

0

いや、!spriteInfoBackだけで(すなわち:spriteInfoBlack == nilnilに対して値をチェックする(自分自身を説得する必要がある場合は、else部分で何かをログ)異なっています、。この変数にはメモリアドレスが格納されており、インスタンスの割り当てが解除されているためクラッシュします。

なぜインスタンスが割り当て解除されたのかを見ることで推測することはできませんので、コード、メモリ管理をもう一度確認してください、そして/または変数にnilを入れてください。テストは失敗しません。

+0

!spriteInfoBackを使用してdeallocをチェックすることはできません。どうすれば確認できますか? –

+0

あなたはあなたのメモリ管理について不明な場合を除き、あなたはそれをチェックしたくありません。あなたがそれらをフォローするなら、あなたのオブジェクトが割り当て解除されたとき*を知っています。 –

+0

私はlazy initializeをしたいので、deallocをチェックします。 –

0

インスタンスは、自動解放プールにあり、自動ループはイベントループの反復の間に流出します。オブジェクトがオートリリースプールから解放されるようにするには、オブジェクトを明示的に保持/解放する必要があります。オブジェクトは保持されていないため、割り当て解除されていますが、ポインタspriteInfoBackはオブジェクトの古いアドレスをまだ覚えています。

関連する問題