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

它不仅不会删除影片剪辑,而且会将影片剪辑更改为新的 Atlas!(我有 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 回答