接続するすべてのクライアントのオブジェクトを作成するサーバー アプリがあります。このオブジェクトの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
が無効化された後にコールバックを送信する理由について何か考えはありますか?