3

cocos2d v1.1.0-beta2b を使用する ios アプリを持っていますが、エミッターの自動削除で非常に奇妙な状態に遭遇しました。

私の質問は:

stopSystemを呼び出す前に、 autoRemoveOnFinished を YES に設定した無限期間 CCParticleSystemQuad を削除する方法ありますか?

ここにいくつかの追加情報があります:

次のようにエミッタを初期化します。

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
emitter = [[[CCParticleSystemQuad alloc]
                                    initWithDictionary:dict] autorelease];
emitter.duration = -1.0f;
[emitter setAutoRemoveOnFinish:YES];
[self addChild:emitter z:10];

その後、もちろん子として追加され、すべてが完全に機能します。多くの場所で提案されているように、それを削除するには、次のように呼び出します。

[emitter stopSystem]; 

その後、すべてのパーティクルがなくなると、エミッターは期待どおりに削除されます。

これまでのところ、すべて順調です。

ただし、エミッターが時期尚早にリリースされたことを示すいくつかのクラッシュ レポートに遭遇した後、私のアプリは stopSystem 行でクラッシュします (エミッターは既にリリースされているため)。エミッターのアクティビティ中にデバイスがロック/ロック解除されたときに時々発生することを示すいくつかのフィードバックを受け取りましたが、私にとっては機能し、これらのクラッシュはまれです. 現象が発生する状況を再現できなかったので、もう一度お尋ねします。

stopSystemを呼び出す前に、 autoRemoveOnFinished を YES に設定した無限期間 CCParticleSystemQuad を削除する方法ありますか?

4

1 に答える 1

-1

ゾンビに感染しているようです。

ゾンビはダングリング ポインターが原因です。ゾンビが指していたオブジェクトは既に解放されていますが、ポインターは引き続きその場所を指しています。そのオブジェクトのメソッドを呼び出そうとすると、クラッシュします。

emitter = [[[CCParticleSystemQuad alloc]
                                initWithDictionary:dict] autorelease];

自動解放されたオブジェクトへのemitterポイント。自動解放プールが排出されていない間、存在し続けるように見えます。

エミッターのアクティビティ中にデバイスがロック/ロック解除されたときに発生することがあります。

emitterこれは、ロック/ロック解除が自動解放プールのドレインをトリガーし、あなたのターンがゾンビになるように聞こえます.

NSZombieEnabledでデバッグできます。NSZombieEnabled オブジェクトは、必要なときにすぐに割り当て解除されませんが、NSZombie オブジェクトに変わります。NSZombie のメソッドを呼び出そうとすると、コンソールにメッセージが表示されます:「割り当て解除されたインスタンスにメッセージが送信されました」。

于 2013-07-13T11:30:19.917 に答える