我正在使用Swift为iOS开发游戏。游戏是轮次玩,当一轮结束时,不再需要它。因此,当有人离开它时,故事板场景可能会停留在传统应用程序中,我希望当游戏导航到该回合后的场景时,该场景将被销毁。
我非常自信我找到了一种方法来实现这一点,因为我正在实例化场景中的某些对象,并且我已经验证了当圆形结束并导航到下一个场景时这些对象的deinit方法会被调用。问题是,对于其中一个对象,没有调用deinit方法,我无法弄清楚原因。故事板场景应该是唯一引用该对象的东西,并且搜索源代码并未显示任何其他用法。似乎故事板场景旁边的东西以某种方式引用了对象,并在场景消失时保持它的存活。
我已经通过在其init方法中设置断点来验证对象是否正在创建,并且该断点在开始回合时会受到影响。
我尝试使用Allocations工具来跟踪可能引用该对象的内容。然而,当我运行游戏并完成回合。我找不到任何证据表明分配工具曾经看过这个对象。我怀疑该乐器可能无法跟踪故事板场景创建的对象,特别是因为我找不到故事板中删除的其他故事板对象的痕迹。
可以做些什么来确定为什么这个对象似乎能够在应该拥有它的故事板场景的生命周期中存活?
答案 0 :(得分:0)
我认为找出了为什么物体没有被摧毁。在它的初始化程序中,它将一个闭包应用于其他东西。闭包含一个对象成员的引用,所以我认为闭包是强烈地捕获自我,即使自己从未明确需要成功编译的东西。这可能是Swift编译器的一个错误;它可能会发出警告或错误;找到和/或防止问题会更容易。无论如何,我改变了闭包,以便它将对象的成员捕获为无主,现在该对象似乎被破坏了。