SKNode.removeFromParent()EXC_BAD_ACCESS

Axe*_*min 3 ios sprite-kit swift 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

它在应用程序启动之前崩溃,我只能看到: xCode的屏幕截图

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

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

Anc*_*inu 6

重要提示:自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
Run Code Online (Sandbox Code Playgroud)

如果你这样做:

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
Run Code Online (Sandbox Code Playgroud)

我认为非常简单,当你.removeFromParent()在代码中调用Apple的代码检查时,==就像在Objective-C中一样.但是因为它是Swift你应该做的===是检查对象的平等而不是==,所以这是一个愚蠢的错误.

恭喜你在SpriteKit Code中发现了一个错误,请填写Apple:D 表格