0

我有一个服务器应用程序,它为每个连接的客户端创建一个对象。在此对象的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在它失效后发送回调的任何想法?

4

1 回答 1

1

某些CFSocket回调可能会在您禁用它们后自动重新启用,特别是kCFSocketDataCallBack. 在您进行禁用调用和套接字无效之间似乎正在使用回调。

为了防止这种行为,您需要使用以下命令禁用它们CFSocketSetSocketFlags

CFOptionFlags sockopt = CFSocketGetSocketFlags (mysock);
sockopt &= kCFSocketDataCallBack;
CFSocketSetSocketFlags(s, sockopt);
于 2011-10-05T15:22:19.157 回答