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