块和引用的奇怪问题

时间:2013-05-22 10:50:08

标签: objective-c automatic-ref-counting sparrow-framework

我正在使用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];

它不仅不会删除动画片段,而且会将动画片段更改为新的地图集! (我有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];

     }];

我得到相同的结果,骰子动画没有删除,它只是切换到显示不同最终数字的另一个地图集。

1 个答案:

答案 0 :(得分: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];

     }];