ios - SKNode.removeFromParent() EXC_BAD_ACCESS

标签 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,配备 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/

相关文章:

ios - 创建iOS应用的通用音频路径

html - 如何在 iOS 中检测 UIWebView 中音频的播放状态?

swift - NSDate timeIntervalSinceDate 计算错误 60 分钟

swift - 我怎样才能制作像数字 8 这样的路径(SpriteKit,Swift)

ios - 是否同时调用多个 didBeginContact 调用?

iphone - iPhone游戏的游戏中心集成?

ios - 在 swift 4 中访问相机和照片库

ios - iOS 中另一个请求中的 HTTP 请求

ios - 多点连接 - 如何查看找到的设备

swift - 如何让 SKAction 运行的函数更新资金 Int?