【问题标题】:SKNode.removeFromParent() EXC_BAD_ACCESSSKNode.removeFromParent() EXC_BAD_ACCESS
【发布时间】:2014-08-20 14:07:42
【问题描述】:

我注意到我的 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() 使错误消失。

【问题讨论】:

    标签: ios swift sprite-kit xcode6-beta6


    【解决方案1】:

    重要提示:自 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 代码中发现了一个错误,go fill a form at Apple:D

    【讨论】:

    • 我明白了..我将命名我的所有节点!谢谢
    • 感谢您报告此事。我也遇到了这个错误。
    【解决方案2】:

    只有当 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];
    

    警告从父级中删除具有相同名称的错误!!!!!!!!!

    【讨论】:

    • 是的逻辑,相同的名称,所以比较给出相同的结果
    猜你喜欢
    • 2014-01-19
    • 2018-01-13
    • 2012-07-24
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多