0

私のプログラムは、次の行で頻繁にクラッシュします (不正なアクセス)。

int writeSize = [_outputStream write:pCopyOfDataBuff maxLength:sendLength];

pCopyOfDataBuff は

pCopyOfDataBuff = new unsigned char [sendLength];

クラッシュした行の直前に割り当てられ、スタックにデータが書き込まれます。Context は、このストリームを処理する特別なスレッドです。

シンボリック例外ブレークポイントを使用してデバッガーで停止すると、_outputStream が実際に閉じられていることがわかります。

[_outputStream close];

メインスレッドで閉じられました。現在、これは同時に発生している可能性があります。

私の質問: 複数のスレッドで、このように NSOutputStream を処理しても安全ですか? NSStream へのすべての呼び出しを同じスレッドに同期する必要がありますか?

ありがとう。ドキュメントで簡単な答えが見つかりません。

4

1 に答える 1

3

最近、同じ問題が発生しました。メイン スレッドの一部のデリゲートが[myQueue cancelAllOperations]で操作キューをシャットダウンし、次のように接続を閉じることを発見しました。

-(void)closeStream:(NSStream *)stream {
    [stream setDelegate:nil];
    [stream close];
    [stream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}

私の説明は、書き込みの途中で[self.outputStream write:bytes maxLength:bytesRecieved];出力ストリームが閉じられたというものでした。

NSOperationQueue が終了するのを待って解決しました: [myQueue waitUntilAllOperationsAreFinished]

これが問題の解決に役立つことを願っています。

于 2013-10-11T13:32:55.157 に答える