1

編集:実際に[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 を処理するには、これが必要です。これを修正するにはどうすればよいですか? ありがとう!

4

1 に答える 1

0

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

解決策は、次のように、接続クラスで保持を呼び出すことです。

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

または、ARC を有効にしている場合は、Connection を割り当てるクラスでインスタンス変数を作成し、そこに接続のインスタンスを格納します。そうすれば、インスタンス var が参照としてカウントされるため、ARC は割り当てを解除しません。

于 2013-05-27T15:45:09.433 に答える