Macos 如何阻止CFSocket发送回调?
我有一个服务器应用程序,它为每个连接的客户端创建一个对象。在这个对象的Macos 如何阻止CFSocket发送回调?,macos,cocoa,callback,invalidation,cfsocket,Macos,Cocoa,Callback,Invalidation,Cfsocket,我有一个服务器应用程序,它为每个连接的客户端创建一个对象。在这个对象的init方法中,我使用这个代码创建一个CFSocket来与客户端通信: CFSocketContext context = { .info = self }; socket = CFSocketCreateWithNative( kCFAllocatorDefault, nativeSocket, kCFSocketDataCallBack, SocketCallback, &context ); sourc
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
。看起来回调很可能是在您进行禁用调用和套接字失效之间使用的
要防止这种行为,您需要使用CFSocketSetSocketFlags
禁用它们:
CFOptionFlags sockopt = CFSocketGetSocketFlags (mysock);
sockopt &= kCFSocketDataCallBack;
CFSocketSetSocketFlags(s, sockopt);
好消息,但这不是问题所在。原来CFSocket不喜欢从回调处理程序内部失效。解决了这个问题。在没有意识到这一点的情况下,我从回调处理程序内部调用了release(以及dealloc)。原来CFSocket不喜欢这样。