SKScene 在关闭视图控制器时使应用程序崩溃
SKScene crashing the app while closing the view controller
我正在按照教程像 Periscope 一样漂浮爱心。
为了给出基本提示,我在下面发布代码
let heartHeight: CGFloat = 18.0
let heartsFile = "heart-bubbles.sks"
class HeartBubblesScene : SKScene {
var emitter: SKEmitterNode?
override func didMoveToView(view: SKView) {
scaleMode = .ResizeFill // make scene's size == view's size
//backgroundColor = UIColor.clearColor()
}
func beginBubbling() {
emitter = SKEmitterNode(fileNamed: heartsFile)
let x = floor(size.width / 2.0)
let y = heartHeight
emitter!.position = CGPointMake(x, y)
emitter!.name = "heart-bubbles"
emitter!.targetNode = self
emitter?.numParticlesToEmit = 1
addChild(emitter!)
emitter?.resetSimulation()
}
在我的 viewdidload 中,我有这样的代码来呈现场景
heartBubblesView.presentScene(heartBubblesScene)
其中heartBubblesView是一个SKView,我是通过Outlet做的。
当我来回访问那个视图控制器时,问题就出现了;突然,它崩溃了,并向我展示了以下逻辑:
SpriteKit`std::__1::__tree_iterator*, int> std::__1::__tree, std::__1::allocator >::find:
0x29fd0f4c <+0>: ldr r3, [r0, #4]!
0x29fd0f50 <+4>: cbz r3, 0x29fd0f82 ; <+54>
0x29fd0f52 <+6>: ldr.w r12, [r1]
0x29fd0f56 <+10>: mov r9, r0
-> 0x29fd0f58 <+12>: ldr r2, [r3, #0x10]
0x29fd0f5a <+14>: cmp r2, r12
0x29fd0f5c <+16>: bhs 0x29fd0f66 ; <+26>
0x29fd0f5e <+18>: ldr r3, [r3, #0x4]
0x29fd0f60 <+20>: cmp r3, #0x0
0x29fd0f62 <+22>: bne 0x29fd0f58 ; <+12>
0x29fd0f64 <+24>: b 0x29fd0f70 ; <+36>
0x29fd0f66 <+26>: ldr r2, [r3]
0x29fd0f68 <+28>: mov r9, r3
0x29fd0f6a <+30>: cmp r2, #0x0
0x29fd0f6c <+32>: mov r3, r2
0x29fd0f6e <+34>: bne 0x29fd0f58 ; <+12>
0x29fd0f70 <+36>: cmp r9, r0
0x29fd0f72 <+38>: beq 0x29fd0f82 ; <+54>
0x29fd0f74 <+40>: ldr.w r2, [r9, #0x10]
0x29fd0f78 <+44>: ldr r1, [r1]
0x29fd0f7a <+46>: cmp r1, r2
0x29fd0f7c <+48>: it lo
0x29fd0f7e <+50>: movlo r9, r0
0x29fd0f80 <+52>: b 0x29fd0f84 ; <+56>
0x29fd0f82 <+54>: mov r9, r0
0x29fd0f84 <+56>: mov r0, r9
0x29fd0f86 <+58>: bx lr
然后我尝试在上面添加 deinit class
deinit
{
emitter?.targetNode = nil
emitter!.removeAllChildren()
}
那也不行。
我不知道,但我将其放在我的视图控制器中的 deinitialser 方法下方,删除该 SKScene 的所有子项似乎可以解决问题。
deinit
{
heartBubblesScene.removeAllChildren()
}
我正在按照教程像 Periscope 一样漂浮爱心。
为了给出基本提示,我在下面发布代码
let heartHeight: CGFloat = 18.0
let heartsFile = "heart-bubbles.sks"
class HeartBubblesScene : SKScene {
var emitter: SKEmitterNode?
override func didMoveToView(view: SKView) {
scaleMode = .ResizeFill // make scene's size == view's size
//backgroundColor = UIColor.clearColor()
}
func beginBubbling() {
emitter = SKEmitterNode(fileNamed: heartsFile)
let x = floor(size.width / 2.0)
let y = heartHeight
emitter!.position = CGPointMake(x, y)
emitter!.name = "heart-bubbles"
emitter!.targetNode = self
emitter?.numParticlesToEmit = 1
addChild(emitter!)
emitter?.resetSimulation()
}
在我的 viewdidload 中,我有这样的代码来呈现场景
heartBubblesView.presentScene(heartBubblesScene)
其中heartBubblesView是一个SKView,我是通过Outlet做的。
当我来回访问那个视图控制器时,问题就出现了;突然,它崩溃了,并向我展示了以下逻辑:
SpriteKit`std::__1::__tree_iterator*, int> std::__1::__tree, std::__1::allocator >::find: 0x29fd0f4c <+0>: ldr r3, [r0, #4]! 0x29fd0f50 <+4>: cbz r3, 0x29fd0f82 ; <+54> 0x29fd0f52 <+6>: ldr.w r12, [r1] 0x29fd0f56 <+10>: mov r9, r0 -> 0x29fd0f58 <+12>: ldr r2, [r3, #0x10] 0x29fd0f5a <+14>: cmp r2, r12 0x29fd0f5c <+16>: bhs 0x29fd0f66 ; <+26> 0x29fd0f5e <+18>: ldr r3, [r3, #0x4] 0x29fd0f60 <+20>: cmp r3, #0x0 0x29fd0f62 <+22>: bne 0x29fd0f58 ; <+12> 0x29fd0f64 <+24>: b 0x29fd0f70 ; <+36> 0x29fd0f66 <+26>: ldr r2, [r3] 0x29fd0f68 <+28>: mov r9, r3 0x29fd0f6a <+30>: cmp r2, #0x0 0x29fd0f6c <+32>: mov r3, r2 0x29fd0f6e <+34>: bne 0x29fd0f58 ; <+12> 0x29fd0f70 <+36>: cmp r9, r0 0x29fd0f72 <+38>: beq 0x29fd0f82 ; <+54> 0x29fd0f74 <+40>: ldr.w r2, [r9, #0x10] 0x29fd0f78 <+44>: ldr r1, [r1] 0x29fd0f7a <+46>: cmp r1, r2 0x29fd0f7c <+48>: it lo 0x29fd0f7e <+50>: movlo r9, r0 0x29fd0f80 <+52>: b 0x29fd0f84 ; <+56> 0x29fd0f82 <+54>: mov r9, r0 0x29fd0f84 <+56>: mov r0, r9 0x29fd0f86 <+58>: bx lr
然后我尝试在上面添加 deinit class
deinit
{
emitter?.targetNode = nil
emitter!.removeAllChildren()
}
那也不行。
我不知道,但我将其放在我的视图控制器中的 deinitialser 方法下方,删除该 SKScene 的所有子项似乎可以解决问题。
deinit
{
heartBubblesScene.removeAllChildren()
}