2011-10-05 77 views
0

我有一个服务器应用程序为每个连接的客户端创建一个对象。在此对象的init方法我用这个代码创建一个CFSocket与客户沟通:如何阻止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在无效后发送回调的任何想法?

+0

解决了这个问题。在没有意识到它的情况下,我从回调处理程序中调用release(以及dealloc)。原来,CFSocket不喜欢那样。 – Sven

回答

1

某些CFSocket回调可能会在您禁用它们后自动重新启用,特别是kCFSocketDataCallBack。看起来可能是您在进行禁用调用和套接字失效之间使用了回调。

为了防止这种行为,你需要CFSocketSetSocketFlags禁用它们:

CFOptionFlags sockopt = CFSocketGetSocketFlags (mysock); 
sockopt &= kCFSocketDataCallBack; 
CFSocketSetSocketFlags(s, sockopt); 
+0

良好的信息,但这不是问题。原来,CFSocket不喜欢在回调处理程序中失效。 – Sven