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()
}
}
Перед запуском приложения происходит сбой, и все, что я вижу, это:
Мой конфиг - 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];
предупреждение УДАЛИТЬ ОТ РОДИТЕЛЯ С ЖЕ ИМЕНИЮ ЖУКА!!!