如何阻止CFSocket发送回调



我有一个服务器应用程序,它为每个连接的客户端创建一个对象。在这个对象的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);

相关内容

  • 没有找到相关文章

最新更新