0

私は 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];

     }];

同じ結果が得られ、サイコロのアニメーションは削除されず、別の最終的な数字を示す別のアトラスに切り替わるだけです。

4

1 に答える 1

0

デフォルトでは、ブロック内の参照型オブジェクトを参照すると保持されます。保持を防ぐには、__block としてマークする必要があります。次の方法を試してください

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];

         [weakSP removeChild:weakMC];

     }];
于 2013-05-22T13:27:32.887 に答える