在我的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-Beta 6,iPad Mini Retina和OS8-Beta5和OSX10.9.4。我还在模拟器中复制了bug;使用xCode6-Beta5;并在touchesBegan方法中移动代码。
取消对行sprite.removeFromParent()的注释,使bug消失。
发布于 2014-08-21 13:56:44
的重要性:这个错误已经从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()时,苹果的代码检查是否与==在代码中相等,就像他们在Objective中所做的那样。但是由于它是Swift,所以您应该使用===来检查对象等式而不是==,所以这是一个愚蠢的错误。
祝贺您在SpriteKit代码中发现了一个错误,去苹果公司填一张表格 :D
发布于 2014-09-11 10:35:51
只有当SKNode具有相同的名称和相同的类时,才会发生这种情况。设置为SKNode唯一名称。
我的代码:-(空) 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];警告从同名错误父母处删除
https://stackoverflow.com/questions/25406872
复制相似问题