我注意到我的 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,配备 iOS8-Beta5 和 OSX 10.9.4 的 iPad Mini Retina。
我还在模拟器中重现了这个错误;使用 xCode6-Beta5;并在 touchesBegan
方法中移动代码
取消注释行 sprite.removeFromParent()
使错误消失。
最佳答案
重要提示:自 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< 中所做的那样/em>。但由于它是 Swift,您应该执行 ===
来检查对象相等性 而不是 ==
,所以愚蠢的错误。
恭喜你在 SpriteKit 代码中发现了一个错误,go fill a form at Apple :D
关于ios - SKNode.removeFromParent() EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25406872/