编辑:我实际上将其追溯到我调用 [in open] 的行;并尝试打开输入流。出于某种原因,我的自定义类可能是无效的委托?我看到其他人有同样的错误,并且在将所有内容移动到 ViewController 子类而不是扩展 NSObject 的自定义类之后没有问题。但是,我仍然想使用我自己的自定义类,而不是 ViewControllers 之一。
我有一个我自己编写的 Connection 类,我使用 NSInputStream 和 NSOutputStream。我在 init 方法中初始化流:
- (id)init {
self = [super init];
if(self) {
messages = [NSMutableArray new];
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)HOST, PORT, &readStream, &writeStream);
[self setIn: (__bridge_transfer NSInputStream *)readStream];
[self setOut: (__bridge_transfer NSOutputStream *)writeStream];
NSLog(@"Streams opened.");
NSLog(@"ConnectionController initialized...");
}
return self;
}
另外,这是我在 .h 中的连接类的定义
@interface ConnectionController : NSObject <NSStreamDelegate> {
NSMutableArray *messages;
}
@property (strong, nonatomic) NSInputStream *in;
@property (strong, nonatomic) NSOutputStream *out;
-(void)sendMessage:(NSString*)msg;
-(void)stream:(NSStream *)eStream handleEvent:(NSStreamEvent)eventCode;
-(void)messageReceived:(NSString*)msg;
@end
当我调用这个方法 openStreams 时,我得到 EXC_BAD_ACCESS
- (void)openStreams {
[in setDelegate:self];
[out setDelegate:self];
[in scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[out scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[in open];
[out open];
}
当我注释掉 setDelegate:self 时,错误不会发生。但是,我需要这个才能使用事件驱动的方法来处理 NSStreamEvents 我该如何解决这个问题?谢谢!