Я использую фреймворк Воробья (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];
}];
я получаю тот же результат, игру в костях анимации не удаляется, и он просто переходит на другой атлас, показывая другое конечное число.
Я не уверен, что это поможет, но попытался ли вы установить __block с __weak? например __weak __block SPMovieClip * weakMC = diceAnimationPlayer1; __weak __block SPSprite * weakSP = деревняSprite; – taffarel
Можете ли вы поместить это в качестве ответа, чтобы лучше видеть форматирование, но я не совсем понимаю, что вы подразумеваете под __block? – Phil