在我看来,如果流被另一个线程关闭,无论套接字连接的另一端如何,任何 NSInputStream 对象都应该从它的 read: 方法中弹出。但在某些情况下,这似乎不是真的。似乎除非对方首先在连接上至少发送一次,否则 read: 方法将不会响应流关闭。
打开连接的代码:
// Open the socket...
CFStreamCreatePairWithSocketToHost(NULL, Host, Port, &readStream, &writeStream);
// Create NSStream objects for our use...
inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;
// take ownership of the NSStream objects...
[inputStream retain];
[outputStream retain];
// open the streams....
[inputStream open];
[outputStream open];
关闭连接的代码:
// Close the streams...
[inputStream close];
[outputStream close];
// Release ownership...
[outputStream release];
[inputStream release];
// clear reference values...
outputStream = nil;
inputStream = nil;
在接收线程中:
-(uint8_t) GetByte
{
uint8_t c;
int N = [inputStream read:&c maxLength:1];
if ( N < 1 )
@throw [[TcpClientException alloc] init];
return c;
}
当我从主线程关闭流时,接收线程仍保留在读取方法中。最终它超时并崩溃。即使崩溃也不会导致任何类型的对象被抛出(我试图包围代码以捕获任何东西(id)并且什么也没有得到)。
每次要关闭流时,如何可靠地强制读取弹出?
此外:
我在 ML 上使用 XCODE 4.4.1 和 5.1 iPad 模拟器。
如果我只关闭 inputStream 而没有释放或设置为 nil,那么也会出现问题。