我有一个服务器应用程序,它为每个连接的客户端创建一个对象。在这个对象的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
在无效后发送回调,有什么想法吗?
一些CFSocket
回调可能会在您禁用它们之后自动重新启用,特别是kCFSocketDataCallBack
。似乎在您进行disable调用和套接字失效之间正在使用回调。
要防止这种行为,您需要使用CFSocketSetSocketFlags
:
CFOptionFlags sockopt = CFSocketGetSocketFlags (mysock);
sockopt &= kCFSocketDataCallBack;
CFSocketSetSocketFlags(s, sockopt);