SKNode.removeFromParent()EXC_BAD_ACCESS

时间:2014-08-20 14:07:42

标签: ios swift sprite-kit xcode6-beta6

我在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()
    }
}

它在应用程序启动之前崩溃,我只能看到: Screenshot of xCode

我的配置是xCode6-Beta6,iPad Mini Retina,iOS8-Beta5和OSX 10.9.4。 我还复制了模拟器中的bug;使用xCode6-Beta5;并在touchesBegan方法

中移动代码

取消注释行sprite.removeFromParent()会使错误消失。

2 个答案:

答案 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 !!!!!!!!