我的程序经常在以下行崩溃(访问不当):
int writeSize = [_outputStream write:pCopyOfDataBuff maxLength:sendLength];
pCopyOfDataBuff是
pCopyOfDataBuff = new unsigned char [sendLength];
在崩溃线之前分配并填充堆栈上的数据。 Context是处理此流的特殊线程。
当我在调试器中停止使用符号异常断点时,我发现_outputStream实际上是已关闭。
[_outputStream close];
在MAIN主题中关闭。现在这可能同时发生了。
我的问题:在多线程中处理这样的NSOutputStream是否安全?我应该将对NSStream的所有调用同步到同一个线程吗?
感谢。我在文档中找不到简单的答案。
答案 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]。
希望这有助于解决您的问题。