2013-05-22 62 views
0

我使用Sparrow框架(V2),我有一个很奇怪的问题,这可能是与麻雀有关,或者它可能与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]; 

    }]; 

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

+0

我不确定它会有帮助,但是您是否尝试将__block与__weak?例如__weak __block SPMovieClip * weakMC = diceAnimationPlayer1; __weak __block SPSprite * weakSP = villageSprite; – taffarel

+0

你可以把它作为答案,让我可以更好地看到格式,但我不完全明白__block的意思吗? – Phil

回答

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

    }]; 
+0

没有工作,无论如何。 – Phil