2017-08-25 80 views
-1

我遇到内存问题。我收到一条错误消息“线程1:EXC_BAD_ACCESS(code = 1,address = ...)该错误是难以捉摸的,显然取决于时间。在我的iPad mini上,它平均每次平均约3分钟,在我的iPhone SE平均10分钟,并在模拟器上运行20小时而不会崩溃。内存错误的可能原因

我没有成功地使用僵尸探测器。 (请参阅下文,了解我的经验。)因此,我正在试着用细梳梳理我的代码,以查看可能导致崩溃的原因。什么是可能导致分配错误的问题?

我的应用程序是多线程的。它从麦克风发出声音,对其进行处理,并不断用显示的处理结果更新显示。它是用Swift 3编写的,所以我没有做任何明确的malloc或释放。

我正在寻找可能导致错误的代码中的地方。我最近看到的两件事是弱引用和不安全的指针。是否还有其他常见编程错误可能会让我感到不安?我们已经忽略了这个警告,并且试图用我的我的模拟器来试试这个警告。 iPad mini,我无法让它崩溃,一切都以大约1/10的速度运行,当我暂停录制时,我的OSX机器也变得呆滞,一次显示几分钟的旋转“等待”光标。总的内存分配是上下调整的,但是保持在限制范围内,所以没有大的内存泄漏,我也在模拟器上运行了僵尸工具,它同样很低速,但仍然没有崩溃。)

+0

你是否能够在调试器中捕捉到崩溃?有堆栈吗?你有没有将“self”捕获为“无主”的块? –

+0

是的,它显示在调试器中。这里是它的代码吧 'let loByte = bytes [pos]' 'let hiByte = bytes [pos + 1] // break here' 实际值有所不同,但这最后一次pos是630.没有什么不寻常的关于字节或字节的第630和第631个元素的调试器。 –

回答

0

这种情况下的问题证明是线程安全。如果我在一个线程上设置一个UInt8变量并在另一个线程上读取它,它可能会导致内存错误。制定者和获得者不是线程安全的。 (我一直在编程计算机的大部分职业生涯,主要是C,C++和Java。我熟悉这些语言中的多线程问题,我是Swift 3的新手。它只是简单的到目前为止我还没有想到设置和获取数字变量不是原子操作 - 一个错误的访问可能会导致程序崩溃,我将不得不彻底重新思考我的并发Swift方法。 )

相关问题