【发布时间】:2016-08-15 02:50:54
【问题描述】:
我正在构建一个 sprite kit 游戏并且即将完成,因此我开始分析应用程序以确保我没有内存泄漏等以提高性能。
我注意到,当我运行应用程序时,我的内存使用量每秒增长约 1mb:
所以我开始运行 Instruments,并且对使用它不太熟悉,但是从我从在线教程中收集到的内容是,要注意的主要是持久分配对象的数量,以确保您期望的对象be deallocated 实际上是deallocated(即你摧毁的敌人,从场景中移除的子弹等)。 Instruments 确实显示了整个应用程序生命周期中预期的持久/瞬态(释放)对象数量,但也报告了大量内存泄漏(每 10-20 秒约 2000 个 - 不确定是来自设备上的其他应用程序还是我的应用程序) :
这是内存泄漏的另一张图片(没有过滤我的应用名称 - 所以不确定它是否是我的应用负责):
如果我让应用程序运行很长一段时间,超过 10 分钟,它最终会因以下原因而崩溃:
Message from debugger: Terminated due to memory issue
关于如何弄清楚发生了什么的任何建议?报告的 ~2000 内存泄漏实际上来自我的应用程序吗?我在 Instruments 中遗漏了什么吗?
【问题讨论】:
-
您的标题说没有显示泄漏,但仪器显示有数千个泄漏?
-
@dan 抱歉,这意味着应用程序本身没有显示任何泄漏。更新了标题。谢谢。
-
如您所见,这是从一开始就需要考虑的事情,而不是当您完成您的应用程序时。覆盖 deinits 和设计对象之间的关系是防止这种情况的一种措施。您应该覆盖您创建的每个类的 deinit 并在适当的情况下使用弱/无主引用。因此,对此没有灵丹妙药,而是遍历所有代码并搜索保留周期。当实例 A 对实例 B 具有强引用,并且实例 B 对实例 A 具有强引用时,就会发生保留循环。简而言之,要打破这个循环,请创建一个引用 weak。
-
@Whirlwind 很抱歉提供了误导性信息,我在开发应用程序的整个过程中都在考虑这个问题,但我没有经常分析它。我不相信我的问题是保留周期。现在我几乎禁用了所有东西(敌人生成、背景滚动、音乐、update() 方法中的代码等),应用程序仍然稳定地增加内存,大约每秒 0.5mb。它所做的只是显示一个玩家坐在黑屏底部......
-
另外,附注 - 我的应用程序的流程是主菜单场景 -> 角色选择场景 -> 游戏场景。现在,坐在主菜单场景或角色选择场景中,内存保持在静态水平(~108mb,由于复杂的背景层等)。但是一旦我进入游戏场景,即使所有功能都被禁用并且只是黑屏,它也会以每秒 0.1mb 的速度增长。
标签: ios memory-management memory-leaks sprite-kit instruments