我遇到了记忆问题。我收到一条错误消息“线程1:EXC_BAD_ACCESS(代码= 1,地址= ...)错误是难以捉摸的,显然与时间有关。在我的iPad mini上,它通常在崩溃之间平均约3分钟,在我的iPhone SE上平均为10分钟,在模拟器上它运行了20个小时而没有崩溃。
我没有成功使用Zombie探测器。 (请参阅下面的我的经验。)所以我试图用细齿梳检查我的代码,看看可能导致崩溃的原因。可能导致分配错误的问题是什么?
我的应用是多线程的。它从麦克风获取声音,对其进行处理,并使用处理结果不断更新显示。它是用Swift 3编写的,所以我没有做任何明确的mallocs或frees。
我在代码中寻找可能导致错误的地方。我看起来最接近的两件事是弱引用和不安全指针。是否还有其他常见的编程错误可能会让我失望?
(Zombie探测器没用.All Instruments用户指南说,“对于iOS应用程序,使用僵尸模板与iOS模拟器,而不是物理设备。”我忽略了警告并尝试使用我的iPad迷你,我无法让它崩溃。一切都以大约1/10的速度运行,当我暂停录制时,我的OSX机器也变得缓慢,一次显示旋转的“等待”光标几分钟。总内存分配上下,但保持在限制范围内,因此没有重大的内存泄漏。我也在模拟器上运行Zombies仪器。它同样缓慢,并且它仍然不会崩溃。)
答案 0 :(得分:0)
这种情况下的问题证明是线程安全。如果我在一个线程上设置一个UInt8变量并在另一个线程上读取它,则可能导致内存错误。 setter和getter不是线程安全的。
(我在职业生涯的大部分时间都在编写计算机,主要是C,C ++和Java。我熟悉这些语言中的多线程问题。我是Swift 3的新手。它只是没有到目前为止,我一直认为设置和获取数值变量不是原子操作 - 不合时宜的访问可能导致程序崩溃。我将不得不彻底重新思考我使用Swift进行并发的方法。)