私は Sparrow フレームワーク (V2) を使用していますが、Sparrow と関係があるか、または Obj-c と関係がある可能性がある、非常に奇妙な問題が発生しています。プロジェクトにARCを使用しています。
私はサイコロのアニメーションであるムービークリップを作成しています。次に、リスナーを追加し、ブロックを使用してアニメーションとムービークリップを削除しています..
diceAnimationPlayer1 = [self getAnimation:atlasName1 fName:frameName1 nFrames:12];
__weak SPMovieClip *weakMC = diceAnimationPlayer1;
__weak SPSprite *weakSP = villageSprite;
[diceAnimationPlayer1 addEventListenerForType:SP_EVENT_TYPE_COMPLETED block:^(SPEvent *event)
{
[Sparrow.juggler removeObject:weakMC];
[weakSP removeChild:weakMC];
}];
それはすべてうまくいきます。その時点でムービークリップを削除したくないが、別のアニメーションが終了した後など、後日 diceAnimationPlayer1 を削除したい場合に問題が発生します。やろうとしたら
[villageSprite removeChild:diceAnimationPlayer1];
ムービークリップを削除しないだけでなく、ムービークリップを新しいアトラスに変更します! (各面に 1 つずつ、合計 6 つのサイコロ アトラスがあります)、サイコロは最終フレームで新しい数字に変わります。
あるムービークリップを別のムービークリップの上に作成しているかどうかを確認しました。おそらく 2 つあるかもしれませんが、私が見る限り、そうではなく、非常に奇妙です。
誰がこれを引き起こす可能性があるか考えていますか? とにかく、この弱いビジネスのすべてをよく理解していません.弱い参照は、どういうわけか完全に新しいオブジェクトを作成していますか? (デバッグで変数を調べると、それらがすべて同じものを指しているように見えますが)。
また、以下の回答に追加します(残念ながら問題は解決しません)、なぜこれでオブジェクトが削除されないのですか?
diceAnimationPlayer1 = [self getAnimation:atlasName1 fName:frameName1 nFrames:12];
__weak __block SPMovieClip *weakMC = diceAnimationPlayer1;
__weak __block SPSprite *weakSP = villageSprite;
[diceAnimationPlayer1 addEventListenerForType:SP_EVENT_TYPE_COMPLETED block:^(SPEvent *event)
{
[Sparrow.juggler removeObject:weakMC];
[villageSprite removeChild:diceAnimationPlayer1];
//[weakSP removeChild:weakMC];
}];
同じ結果が得られ、サイコロのアニメーションは削除されず、別の最終的な数字を示す別のアトラスに切り替わるだけです。