2012-04-21 8 views
1

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を処理するためのイベントドリブンメソッドを使用するには、これが必要です これを修正するにはどうすればよいですか?ありがとう!

+0

私はこれらのクラスにあまり慣れていませんが、NSInput/Outputストリームが継承するNSStreamのドキュメントは次のように書いています: 'delegateとsetDelegate: デリゲートを返して設定します。デフォルトでは、ストリームオブジェクトはそれ自身のデリゲートでなければなりません。したがって、引数がnilのsetDelegate:メッセージはこのデリゲートを復元する必要があります。 ' – lnafziger

+0

デリゲートオブジェクトが解放され、デリゲートオブジェクトがその行のどこかで割り当て解除された可能性はありますか? – Bryan

答えて

0

何が起こっているかは、Connectionクラス(デリゲートに設定されている)のインスタンスが割り当て解除されている(実行ループでEXC_BAD_ACCESSを引き起こしている)か、保持していないか、ARCおそらく)あなたはそれへの参照を持っていません。

Connection *connection = [[Connection alloc] init]; 
[connection retain]; 

をそれとも、ARCが有効になっていない場合、クラスあなたのalloc Connectionでインスタンス変数を作成し、あなたのインスタンスを格納します。

ソリューションはそうのように、接続クラスに保持呼び出すことのいずれかでありますそこの接続の。 ARCはインスタンスのvarが参照としてカウントするため、この方法ではARCはそれを解放しません。

関連する問題