【发布时间】:2013-05-22 10:50:08
【问题描述】:
我正在使用 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];
}];
我得到了相同的结果,骰子动画没有被删除,它只是切换到另一个显示不同最终数字的图集。
【问题讨论】:
-
我不确定它是否会有所帮助,但您是否尝试将 __block 与 __weak 放在一起?例如 __weak __block SPMovieClip *weakMC = diceAnimationPlayer1; __weak __block SPSprite *weakSP = villageSprite;
-
您能否将其作为答案,以便我可以更好地查看格式,但我不太明白您所说的 __block 是什么意思?
标签: objective-c automatic-ref-counting sparrow-framework