編集:実際に[in open]を呼び出す行までたどりました。入力ストリームを開こうとします。何らかの理由で、カスタム クラスが無効なデリゲートになっている可能性があります。NSObject を拡張するカスタム クラスではなく、ViewController サブクラスにすべてを移動した後、他の誰かが同じエラーを抱えていて、問題がなかったのを見ました。ただし、ViewController の 1 つではなく、独自のカスタム クラスを使用したいと考えています。
自分でコーディングした 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 を処理するには、これが必要です。これを修正するにはどうすればよいですか? ありがとう!