【发布时间】:2019-09-11 07:57:50
【问题描述】:
有几个问题与此完全相反,我不明白在发布模式下运行我的应用程序的工作原理/原因,但在调试模式下崩溃并出现 EXC_BAD_ACCESS 错误。
崩溃的方法是递归的,非常!!重大的;只要没有太多递归,它在调试(iPhone XS 上少于 ~1000,模拟器上无限制)和发布模式(无限制?)中都可以正常工作。
我不知道从哪里开始找出如何调试调试模式,我想知道是否由于堆栈跟踪或其他未知因素捆绑了某种递归软限制?甚至可以归结为电缆,因为我能够在模拟器中成功运行而没有问题?
我应该注意到 Xcode 在看似随机的地方报告崩溃,例如我知道已实例化且有效的属性 getter;以防万一。
我打算将它重构为更小的块,但我想我会在这里发布,以防有人对可能导致此问题的原因有任何想法。
见: https://gist.github.com/ThomasHaz/3aa89cc9b7bda6d98618449c9d6ea1e1
【问题讨论】:
-
鉴于它在 iOS 设备上的崩溃比在模拟器上更快,我首先怀疑正在使用多少内存(因为模拟器可以利用计算机的所有内存,而不是有限的设备的内存)。您是否观察过运行时的消耗?在回答您的问题时,不,我不怀疑调试构建中有任何人为限制,也没有连接问题。我怀疑调试构建的额外安全检查和/或未优化的构建将占用更多内存。因此,请监控应用程序的内存量表或使用 Instruments 的“分配”工具。
-
顺便说一下,如果您为您的方案(僵尸、任何 malloc 功能等)打开了任何诊断选项,请确保在完成后将其关闭那个特殊的诊断。它们中的许多会增加严重的内存开销,只会加剧内存问题。做您需要的诊断,但完成后将其关闭。
-
@Rob,没有内存消耗问题,峰值使用大约 130MB,发布版本峰值使用大约 100MB
-
顺便说一句,如果你简单地将它重构为更小的方法(这通常是一个好主意),它实际上可能会使这里的特定问题变得更糟,更快地耗尽堆栈内存。任何方法调用都会向堆栈推送更多内容(除非优化器将其内联)。