0

接続するすべてのクライアントのオブジェクトを作成するサーバー アプリがあります。このオブジェクトのinitメソッドでは、次のコードを使用して を作成CFSocketし、クライアントと通信します。

CFSocketContext context = {
    .info = self
};

socket = CFSocketCreateWithNative( kCFAllocatorDefault, nativeSocket, kCFSocketDataCallBack, SocketCallback, &context );
source = CFSocketCreateRunLoopSource( kCFAllocatorDefault, socket, 0 );
CFRunLoopAddSource( CFRunLoopGetMain(), source, kCFRunLoopCommonModes );

メイン プログラムがクライアントで完了すると、ClientConnectionオブジェクトが解放され、そのdeallocメソッドが呼び出されます。

CFSocketDisableCallBacks( socket, kCFSocketDataCallBack );

CFRunLoopRemoveSource( CFRunLoopGetMain(), source, kCFRunLoopCommonModes );
CFRelease( source );

CFSocketInvalidate( socket );
CFRelease( socket );

それが完了した後も、クラッシュの原因となる割り当てが解除されたオブジェクトにルーティングされるデータ コールバックを受け取ります。

考えられる限りのことはすべて試しましたが、それでもうまくいきません。CFSocketが無効化された後にコールバックを送信する理由について何か考えはありますか?

4

1 に答える 1

1

一部のCFSocketコールバックは、無効にした後に自動的に再度有効になる場合があります。特にkCFSocketDataCallBack. 無効化呼び出しを行ってからソケットが無効化されるまでの間にコールバックが使用されている可能性があります。

この動作を防ぐには、次の方法で無効にする必要がありますCFSocketSetSocketFlags

CFOptionFlags sockopt = CFSocketGetSocketFlags (mysock);
sockopt &= kCFSocketDataCallBack;
CFSocketSetSocketFlags(s, sockopt);
于 2011-10-05T15:22:19.157 に答える