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不喜欢这样。