NSOutputStream线程对close和writeData方法是否安全?

时间:2013-08-09 07:26:50

标签: ios macos cocoa-touch cocoa network-programming

我的程序经常在以下行崩溃(访问不当):

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

pCopyOfDataBuff是

pCopyOfDataBuff = new unsigned char [sendLength];

在崩溃线之前分配并填充堆栈上的数据。 Context是处理此流的特殊线程。

当我在调试器中停止使用符号异常断点时,我发现_outputStream实际上是已关闭

[_outputStream close];

在MAIN主题中关闭。现在这可能同时发生了。

我的问题:在多线程中处理这样的NSOutputStream是否安全?我应该将对NSStream的所有调用同步到同一个线程吗?

感谢。我在文档中找不到简单的答案。

1 个答案:

答案 0 :(得分: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]

希望这有助于解决您的问题。