我在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。
我还复制了模拟器中的bug;使用xCode6-Beta5;并在touchesBegan
方法
取消注释行sprite.removeFromParent()
会使错误消失。
答案 0 :(得分:6)
重要提示:自iOS 8.1以来,此错误已得到纠正,请确保更新并使您的应用无法用于iOS 8.0及之前。
我发现了会发生什么......应该是一些苹果公司的员工做错了。解释:
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 Code中发现了一个错误go fill a form at Apple:D
答案 1 :(得分:0)
仅当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];
警告使用相同的名称从父母身上移除BUG !!!!!!!!