【问题标题】:How would I fix a SKView if it returns nil?如果返回 nil,我将如何修复 SKView?
【发布时间】:2017-05-03 02:42:32
【问题描述】:

我有一个拥有这个函数的类

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)
    }
}

我试图过渡到的每个场景都继承自这个类,所以它们都有这个功能。然而这个函数运行良好一次,场景改变,但第一次之后,视图一直返回 nil,我不明白为什么。该函数位于每个场景继承的类中,如果这有什么不同的话

【问题讨论】:

  • 您的问题中没有足够的信息继续下去。 view 是否与此函数在同一类中声明?是否应该在这些类之间共享一个 SKView 实例? view应该怎么设置?
  • 视图不是单独的视图类,所以这个类根本不应该删除视图,视图是在应用加载时设置的。
  • 我认为您的问题不在于这段代码,而与view 变量有关,它的声明位置和方式以及设置方式。
  • 如果视图为 nil,则表示该场景尚未呈现。比如在scene的init中,它的view属性为nil是正常的。
  • @ChrisHutchison 分段控件是否通过@IBOutlet 连接到视图控制器?这将不得不在您的类的实例中调用您的valueChanged 函数(您没有将它作为类方法调用)那么该调用是如何处理的?查看视图控制器的代码会非常有用。

标签: swift uiview sprite-kit skscene


【解决方案1】:

您的问题需要更多信息才能让我正确诊断,但从外观上看,您正在处理您的 SKScene ARC (Automatic Reference Count) 达到零,这允许它被释放。

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

您的数组可能正在对 SKScene 实例使用weak 变量。 weakstrong 变量之间的区别在于前者不会将 ARC 添加到 ARC 中,而后者会添加。如果scenes[segment.selectedSegmentIndex] 引用了一个弱变量,那么它将是定义的 SKScene 或 nil,这取决于它是否已被释放。

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

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

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

【讨论】:

    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2012-11-21
    • 2015-11-11
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多