我正在使用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];
}];
我得到相同的结果,骰子动画没有删除,它只是切换到显示不同最终数字的另一个地图集。
答案 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];
}];