FileHandle.write线程安全吗?

时间:2017-09-14 21:37:02

标签: ios multithreading

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

我已确定崩溃链接到将字节复制到UInt8数组的代码段。可以在紧接之前或之后将相同的阵列写入文件系统。我从悲伤的经历中知道,您无法从不同的线程读取和写入来自同一阵列的数据。它会导致崩溃,就像我遇到的那样。但我在实施过程中一直非常小心。将字节写入数组的代码和从中读取字节的代码都在同一串行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?
    }
}

1 个答案:

答案 0 :(得分:0)

FileHandle.write不应该创建另一个线程。我认为最有可能解释来自调试器的消息:由于内存问题而终止&#34;错误是由于某种原因你的应用程序内存不足。可能有些东西没有正确解除分配。

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