2017-09-14 8 views
0

私のアプリで逃げようとするクラッシュをデバッグしようとしています。何分もの間平穏に実行した後、アプリケーションはMessage from debugger: terminated due to memory issueで停止します。スタックトレースはありません。FileHandle.writeはスレッドセーフですか?

クラッシュがバイトを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? 
    } 
} 

答えて

0

FileHandle.writeは別のスレッドを作成すべきではありません。私は、 "デバッガからのメッセージ:メモリの問題のために終了しました"というエラーの可能性が最も高いのは、アプリが何らかの理由でメモリが不足しているということです。おそらく何かが正しく割り当てを解除していないでしょう。

ループ内に複数のUInt8バイト配列を割り当てていますか?

+0

UInt8配列は実行開始時に一度割り当てられ、リサイクルされます。私は、書き込みのための配列のコピーを作成しようとしましたが、それは問題を解決していないので、それはスレッドの問題ではありません。私はXode内のAllocationsとLeaks Instrumentsの下で私のプログラムを実行しました。私はインストゥルメンツでクラッシュすることはできませんが、急激なメモリ増加の兆候はありません。 –

関連する問題