SKNode.removeFromParent() EXC_BAD_ACCESS

Я заметил странное поведение в своем проекте Swift и воспроизвел его в пустом проекте SpriteKit следующим образом:

class GameScene: SKScene {
    override func didMoveToView(view: SKView) {

        let sprite = SKSpriteNode(imageNamed:"Spaceship")
        self.addChild(sprite)
        //sprite.removeFromParent()

        let sprite2 = SKSpriteNode(imageNamed:"Spaceship")
        self.addChild(sprite2)
        sprite2.removeFromParent()
    }
}

Перед запуском приложения происходит сбой, и все, что я вижу, это:Скриншот xCode

Мой конфиг - xCode6-Beta6, iPad Mini Retina с iOS8-Beta5 и OSX 10.9.4. Я также воспроизвел ошибку в симуляторах; с xCode6-Beta5; и перемещая код в touchesBegan метод

Раскомментирование строки sprite.removeFromParent() сделать ошибку исчезнуть.

2 ответа

Решение

ВАЖНО: эта ошибка была исправлена ​​начиная с iOS 8.1, обязательно обновите И сделайте ваше приложение недоступным для iOS 8.0 и более ранних версий.

Я узнал, что происходит... и это должен был быть сотрудник Apple, который допустил ошибку. Пояснения:

let sprite = SKSpriteNode(imageNamed:"Spaceship")
self.addChild(sprite)

let sprite2 = SKSpriteNode(imageNamed:"Spaceship")
self.addChild(sprite2)
sprite2.removeFromParent()

println( sprite == sprite2 ) // Returns "true"
// Then crash

И если вы сделаете это:

let sprite = SKSpriteNode(imageNamed:"Spaceship")
sprite.name = "1"
self.addChild(sprite)

let sprite2 = SKSpriteNode(imageNamed:"Spaceship")
sprite2.name = "2"
self.addChild(sprite2)
sprite2.removeFromParent()

println( sprite == sprite2 ) // Returns "false"
// Then all is right, no crash

Я думаю очень просто, когда вы звоните .removeFromParent() Проверка кода Apple на равенство в коде с == как они сделали бы в Objective-C. Но так как это Swift, вы должны сделать === проверить на предмет равенства, а не ==тупая ошибка.

Поздравляем, вы нашли ошибку в коде SpriteKit, иди заполните форму в Apple: D

Это происходит только тогда, когда SKNode имеют одинаковое имя и класс. Установите уникальное имя SKNode.

Мой код: - (void) removeItemWithIdentifier:(FoodsIdentifiers) идентификатор {

NSArray *items = [foodItemHolderNode children];
int count = (int)[items count];
for (int i = 0; i < count; i++) {
    FoodItemObject *foodItem = [items objectAtIndex:i];
    int itemID = [[foodItem.objectDictionary objectForKey:FOODITEM_IDENTIFIER_KEY] intValue];

    if (itemID == identifier) {
        [foodItem removeFromParent];
        break;
    }

}

// NSString *name = [NSString stringWithFormat:@"ID%i", (int)identifier];
//SKNode *item = [foodItemHolderNode childNodeWithName:name];
//[item removeFromParent];

предупреждение УДАЛИТЬ ОТ РОДИТЕЛЯ С ЖЕ ИМЕНИЮ ЖУКА!!!

Другие вопросы по тегам