我有一个持有此功能的课程
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)
}
}
我试图转换的每个场景都继承自这个类,所以它们都有这个功能。但是这个功能运行一次很好,并且场景发生了变化,但在第一次之后,视图一直没有返回,我不明白为什么。该函数位于每个场景继承的类中,如果它有任何区别
答案 0 :(得分:0)
您的问题需要我提供更多信息才能正确诊断它,但从您看来,您正在处理的SKScene ARC (Automatic Reference Count)达到零,这样就可以将其解除分配。
基本上,只要有人仍在使用它,应用程序就会保留在类中。当您创建一个类实例时,其ARC设置为1.当您将该实例保存在其他位置时,它会上升到2.当这些实例设置为nil时,ARC每次都会下降一次。当它达到零时,它不会在任何地方使用,并且可以并且将被释放。
您的阵列可能正在向SKScene实例使用weak
个变量。 weak
和strong
变量之间的区别在于前者不会向ARC添加一个变量,而后者则不会。如果scenes[segment.selectedSegmentIndex]
引用弱变量,那么它将是定义的SKScene或nil,具体取决于它是否已被解除分配。
最有可能的是scenes[]
变量引用特定场景的实例,但当该场景结束并被解除时,它会将该实例设置为nil。
要记住的一点是,您可能不想保留SKScene的特定实例,否则您将耗尽不必要的内存并加载已播放的场景。
最好在数组中保存类类型并在转换之前重新创建场景。