EDIT:私は実際に[open in]と呼ぶ行にそれをトレースしました。入力ストリームを開こうとします。何らかの理由で、私のカスタムクラスが無効なデリゲートになる可能性がありますか?私は誰かが同じエラーを抱えていて、NSObjectを拡張するカスタムクラスではなく、ViewControllerサブクラスにすべてを移動した後に問題がないことを知りました。しかし、私はまだ自分のカスタムクラスを使用し、ViewControllerの1つを使用しません。iOS5:setDelegate:selfがmain.mでEXC_BAD_ACCESSを実行するのはなぜですか?
自分でコード化した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を処理するためのイベントドリブンメソッドを使用するには、これが必要です これを修正するにはどうすればよいですか?ありがとう!
私はこれらのクラスにあまり慣れていませんが、NSInput/Outputストリームが継承するNSStreamのドキュメントは次のように書いています: 'delegateとsetDelegate: デリゲートを返して設定します。デフォルトでは、ストリームオブジェクトはそれ自身のデリゲートでなければなりません。したがって、引数がnilのsetDelegate:メッセージはこのデリゲートを復元する必要があります。 ' – lnafziger
デリゲートオブジェクトが解放され、デリゲートオブジェクトがその行のどこかで割り当て解除された可能性はありますか? – Bryan