0

Я использую фреймворк Воробья (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 позже, скажем, после завершения другой анимации. Если я попытаюсь сделать

[деревняSprite 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 = деревняSprite; – taffarel

+0

Можете ли вы поместить это в качестве ответа, чтобы лучше видеть форматирование, но я не совсем понимаю, что вы подразумеваете под __block? – Phil

ответ

0

По умолчанию, когда вы ссылаетесь на объект типа referenc внутри вашего блока, он сохраняется, чтобы предотвратить сохранение, вам нужно отметить его как __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