我遵循了设置套接字流指南,并在课堂上有效地复制了该代码。无论我尝试什么,委托方法似乎都没有被调用。
在我的头文件中(基本上):
@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");
}
希望我错过了一些非常简单和明显的东西,第二双眼睛可以发现我的错误。
提前感谢任何有耐心并花时间阅读本文的人!