FileHandle.write线程安全吗?

我试图在我的应用程序中debugging一个难以捉摸的崩溃。 运行几分钟后,应用程序将停止与Message from debugger: terminated due to memory issue 。 没有堆栈跟踪。

我已经确定崩溃链接到将字节复制到UInt8数组中的一段代码。 相同的arrays可以在之前或之后立即写入文件系统。 我从悲惨的经历中知道,你不能从不同的线程向同一个数组读写数据。 它导致了一个非常像我正在经历的崩溃。 但是我在执行中一直非常小心。 将字节写入数组的代码以及从中读取字节的代码都在相同的串行DispatchQueue上运行。

但也许有另一个线程? 在FileHandle.write返回之前写入是否真的完成,还是有一些后台处理?

 func bug() { let bufferSize = ... var fileHandle:FileHandle = ... var fileIndex:UInt64 = ... var bytes = [UInt8](repeating:0, count:bufferSize) fileHandle.seek(toFileOffset: fileIndex) fileHandle.write(Data(bytes)) for pos in 0..<bufferSize { bytes[pos] = ... // Can my app crash here? } } 

FileHandle.write不应该创build另一个线程。 我认为“从debugging器发出的消息:由于内存问题而终止”错误的最可能的解释是由于某种原因您的应用程序内存不足。 可能有些东西不能正确释放。

你在循环中分配多个UInt8字节数组吗?