Я следовал инструкциям Настройка потоков сокетов и эффективно продублировал этот код в своем классе. Независимо от того, что я пробую, методы делегата просто не вызываются.
В заголовочном файле у меня (в основном):
@interface myClass : NSObject <NSStreamDelegate> {
NSInputStream *inputStream;
NSOutputStream *outputStream;
}
- (void)connect;
@end;
Способ подключения:
- (void)connect {
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef)@"host.example.com", 1234, &readStream, &writeStream);
inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
}
Также попытался использовать CFStreamCreatePairWithSocketToCFHost()
и [NSStream getStreamsToHost:port:inputStream:outputStream:
- все с одинаковым результатом.
Я установил точку останова в начале метода connect
, прошел через каждую строку, и каждый указатель действителен и, кажется, указывает на правильный объект.
В GDB после вызовов setDelegate
po [inputStream delegate]
печатает <myClass: 0x136380>
, как и ожидалось, поэтому он правильно установил делегата.
Что касается меня, я не могу понять, почему он отказывается вызывать метод stream:handleEvent:
в моем классе:
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
NSLog(@"got an event");
}
Надеюсь, я упустил что-то действительно простое и очевидное, и вторая пара глаз может определить мою ошибку.
Заранее спасибо всем, кто проявил терпение и нашел время, чтобы прочитать это далеко!