我有一个服务器应用程序,为每个连接的客户端创建一个对象。在这个对象的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为什么在失效后发送回调,有什么想法吗?
发布于 2011-10-05 23:22:19
某些CFSocket回调可能会在您禁用它们后自动重新启用,特别是kCFSocketDataCallBack。似乎在您发出禁用调用的时间和套接字失效的时间之间正在使用回调。
要防止此行为,您需要使用CFSocketSetSocketFlags禁用它们
CFOptionFlags sockopt = CFSocketGetSocketFlags (mysock);
sockopt &= kCFSocketDataCallBack;
CFSocketSetSocketFlags(s, sockopt);https://stackoverflow.com/questions/7663227
复制相似问题