【问题标题】:iOS - Memory usage constantly grows even though no memory leaks shown for actual app (SpriteKit App)iOS - 即使实际应用程序(SpriteKit 应用程序)没有显示内存泄漏,内存使用量也会不断增长
【发布时间】: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


【解决方案1】:

好的,当启用“showsPhysics”时,问题是 Apple 错误。关闭它立即解决了我的问题。谢谢@SklyerLauren。

【讨论】:

  • 有时这会解决内存泄漏,但它不是必需的,并且通常会隐藏另一个问题。当您呈现一个新场景时,它将自动释放,除非有保留周期。我最好的猜测是您使用的是 self.在闭包或块中。删除该操作后,您将不再有泄漏。长话短说,如果你使用自我(而不是弱自我)场景->SKActionBlockWithSelf SKActionBlockWithSelf
  • @SkylerLauren 感谢您的反馈。看来我弄错了,由于某种原因,内存使用量停止增长了一段时间,但现在它仍在每秒攀升 0.1mb,即使游戏场景中的所有内容都被禁用并且只有黑屏。这是我遇到这个问题的唯一场景,所有其他场景都很好。太奇怪了。
  • 很可能这是一个合法的 Apple Bug,并且已被报告。除非您碰巧遇到听说过它的人,否则排除故障也非常令人沮丧。
  • 啊啊啊就是这样!天哪,这很烦人。好吧,现在我知道了……看起来我的应用在我禁用它后实际上已经相当不错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2012-06-16
  • 2013-07-12
  • 2012-01-11
  • 2023-03-19
  • 2015-07-07
  • 2012-08-27
相关资源
最近更新 更多