如果SKView返回nil,我将如何修复它?

时间:2017-05-03 02:42:32

标签: swift uiview sprite-kit skscene

我有一个持有此功能的课程

func valueChanged() {
    run(tapSound)
    let sceneto = scenes[segment.selectedSegmentIndex]
    let trans = SKTransition.fade(with: .white, duration: 1.5)
    if view == nil {
        print("view is nil")
    } else {
        view?.presentScene(sceneto, transition: trans)
        print("ran",segment.selectedSegmentIndex,scenes.count)
    }
}

我试图转换的每个场景都继承自这个类,所以它们都有这个功能。但是这个功能运行一次很好,并且场景发生了变化,但在第一次之后,视图一直没有返回,我不明白为什么。该函数位于每个场景继承的类中,如果它有任何区别

1 个答案:

答案 0 :(得分:0)

您的问题需要我提供更多信息才能正确诊断它,但从您看来,您正在处理的SKScene ARC (Automatic Reference Count)达到零,这样就可以将其解除分配。

基本上,只要有人仍在使用它,应用程序就会保留在类中。当您创建一个类实例时,其ARC设置为1.当您将该实例保存在其他位置时,它会上升到2.当这些实例设置为nil时,ARC每次都会下降一次。当它达到零时,它不会在任何地方使用,并且可以并且将被释放。

您的阵列可能正在向SKScene实例使用weak个变量。 weakstrong变量之间的区别在于前者不会向ARC添加一个变量,而后者则不会。如果scenes[segment.selectedSegmentIndex]引用弱变量,那么它将是定义的SKScene或nil,具体取决于它是否已被解除分配。

最有可能的是scenes[]变量引用特定场景的实例,但当该场景结束并被解除时,它会将该实例设置为nil。

要记住的一点是,您可能不想保留SKScene的特定实例,否则您将耗尽不必要的内存并加载已播放的场景。

最好在数组中保存类类型并在转换之前重新创建场景。