【问题标题】:Strange issue with blocks and references块和引用的奇怪问题
【发布时间】: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


【解决方案1】:

默认情况下,当您在块内引用引用类型对象时,它会被保留,为防止保留,您需要将其标记为 __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];

     }];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2015-12-20
    • 2011-10-10
    相关资源
    最近更新 更多