Мне кажется, что любой объект 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) и ничего не получил).
Как надежно заставить чтение выскакивать каждый раз, когда потоки должны быть закрыты?
Кроме того:
Я использую XCODE 4.4.1 на ML с симулятором iPad 5.1.
Если я только закрываю inputStream и не выпускаю или не устанавливаю значение nil, проблема также возникает.