【问题标题】:Detecting references for a Swift object allocated by a storyboard检测故事板分配的 Swift 对象的引用
【发布时间】:2015-08-21 17:55:41
【问题描述】:

我正在使用 Swift 为 iOS 开发游戏。游戏以回合进行,当回合结束时,不再需要。因此,与当有人离开时故事板场景可能会一直停留的传统应用程序不同,我希望在游戏导航到下一回合的场景时销毁该回合的场景。

我非常有信心我已经找到了一种方法来做到这一点,因为我正在实例化场景中的某些对象,并且我已经验证了这些对象的 deinit 方法会在回合结束并导航到下一个场景时被调用.问题是对于其中一个对象,没有调用 deinit 方法,我无法弄清楚原因。故事板场景应该是唯一引用该对象的东西,并且搜索源代码没有发现任何其他用法。似乎故事板场景旁边的某些东西以某种方式引用了该对象,并在场景消失时使其保持活动状态。

我已通过在其 init 方法中设置断点来验证对象正在创建,并且该断点在开始回合时被命中。

我尝试使用分配工具来跟踪可能引用该对象的内容。但是,当我运行游戏并完成回合时。我找不到任何证据表明分配工具曾经看到过这个物体。我怀疑该仪器可能无法跟踪由情节提要场景创建的对象,尤其是因为我找不到其他情节提要对象的痕迹,这些对象确实被情节提要删除。

可以做些什么来确定为什么这个对象似乎在应该拥有它的故事板场景的生命周期之后仍然存在?

【问题讨论】:

  • 我很确定 Apple 已经在 WWDC 上记录并声明,故事板的生命周期是一个“实现细节”,所以我认为你正在与这个进行一场艰苦的战斗。为什么不能在新回合开始时重置场景,从而让 iOS 缓存故事板?通常最好不要与他们的 API 抗争,因为他们固执己见,绕过它们会导致痛苦和糟糕的性能。
  • “我非常有信心我已经找到了一种方法来做到这一点”您不必“想出一个方法”。有标准的方法可以做到这一点。您正在使用其中之一吗?你到底在做什么
  • “我怀疑仪器可能无法跟踪由情节提要场景创建的对象”好吧,你错了。故事板加载是对象实例化,Instruments 看到它就像它看到任何对象实例化一样。这种误解让我怀疑你的测量是否有意义。在我看来,这听起来更像是您只是不知道如何使用 Instruments - 并不是说​​它易于使用,所以没有责任,但如果您使用错误,您会得到错误(或看起来错误)的结果。 Instruments 会准确地告诉你这个对象的保留/释放事件。
  • 如何删除场景对我来说并不明显。我这样做的方法是将 UINavigationController 设置为窗口的 rootVIewController,访问该控制器并调用 setViewControllers 传入的数组中仅包含一个控制器,以供下一个场景显示的控制器使用。别人怎么能删除场景?

标签: ios swift xcode-storyboard


【解决方案1】:

我想知道为什么该对象没有被销毁。在它的初始化程序中,它正在对其他东西应用闭包。闭包包含对对象成员的引用,因此我认为闭包强烈地捕获了 self,即使事情从未明确需要 self 才能成功编译。这可能是 Swift 编译器的一个错误;它可能对此发出警告或错误;找到和/或防止问题会更容易。无论如何,我更改了闭包,以便它将对象的成员捕获为无主,现在该对象似乎被破坏了。

【讨论】:

    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    相关资源
    最近更新 更多