2011-09-11 9 views
0

私はこの設定を持っています:cocos2dはスプライトをアクションで削除します

レイヤーにはスプライトがあります。スプライトは、そのinitメソッドでこのコードを持っています

id fadeOut = [CCFadeOut actionWithDuration:1.0f]; 
id death = [CCCallFunc actionWithTarget:self selector:@selector(die)]; 
self.deathAction = [CCSequence actions:fadeOut, death, nil]; 
[self runAction:deathAction_]; 

死のアクションは、そのステータスが「死んだ」に変更されたスプライトの「ダイ」メソッドを呼び出します。その更新方法で

層をチェックし、すべての子どもたちとのものがWICH削除するには、と「死んで」であり:

[self removeChild:child cleanup:YES]; 

問題は、子スプライトはまだこの行の後に2のretaincountを持っているということです。私はそれがCCCallFuncによって保持されていることを理解しています。このdeathActionを省略し、不透明度がゼロのスプライトを削除すると(コードが色あせている場合)、コードが動作しており、deallocメソッドが呼び出されます。

アクションを適切に使用してスプライトを削除するにはどうすればよいですか?

答えて

1

すべてのコードを表示するわけではありません。しかし、それはあなたがその行動を参照していることを示していると思われます。

retainCountは悪名高い信頼性が低いです:linkのでがそれを使用していないと、確かに正確であると、それを頼りにしないでください。

+0

あなたは参考になりました。私はコードがスプライトによって内部的に処理されるようにコードを修正しました。私はアクションを通して死のメソッドを呼び出し、 '[self removeFromParentAndCleanup:YES];と呼びます。問題はこの呼び出しの前に' [deathAction_ release];を呼び出すことでした。どうして?私はスプライトのdeallocメソッドでリリースコールを持っていますか?何かアクション以外の方法でスプライトを削除したいのですが? – bolshas

+0

バランスを保っているものを正確に知らなくてもオブジェクトを解放している場合は、症状を隠しただけで問題は解決しません。 – bbum

関連する問題