【发布时间】:2017-08-25 22:58:54
【问题描述】:
我遇到了内存问题。我收到一条错误消息“线程 1:EXC_BAD_ACCESS(code=1,address=...) 该错误难以捉摸,显然与时间有关。在我的 iPad mini 上,崩溃之间的平均间隔通常约为 3 分钟,在我的 iPhone SE 上平均为 10 分钟,而在模拟器上它已经运行了 20 小时而没有崩溃。
我没有成功使用僵尸探测器。 (见下文我的经验。)所以我试图用细齿梳检查我的代码,看看是什么导致了崩溃。哪些问题可能导致分配错误?
我的应用是多线程的。它从麦克风获取声音,对其进行处理,并使用处理后的结果不断更新显示。它是用 Swift 3 编写的,所以我没有做任何显式的 malloc 或 frees。
我正在寻找代码中可能导致错误的地方。我最接近的两件事是弱引用和不安全指针。是否有任何其他常见的编程错误可能会绊倒我?
(僵尸探测器没用。Apple Instruments 用户指南说:“对于 iOS 应用程序,请使用带有 iOS 模拟器的僵尸模板,而不是物理设备。”我忽略了警告并在我的 iPad 上进行了尝试mini,我不能让它崩溃。一切都以大约 1/10 的速度运行,当我暂停录制时,我的 OSX 机器也变得迟缓,一次显示旋转的“等待”光标几分钟。总内存分配上下波动,但保持在限制范围内,因此没有严重的内存泄漏。我也在模拟器上运行了 Zombies 仪器。它同样缓慢,但仍然没有崩溃。)
【问题讨论】:
-
你能在调试器中捕捉到崩溃吗?有栈吗?您是否有将
self捕获为unowned的块? -
是的,它显示在调试器中。这是它在
let loByte = bytes[pos]let hiByte = bytes[pos+1] // breaks here上的代码,实际值有所不同,但最后一次 pos 是 630。在调试器中,无论是字节还是第 630 和 631 个字节元素都没有什么异常。
标签: ios memory-management swift3