我将上下文设置为创建套接字的类的地址,如下所示:
CFSocketContext ctxt = {0, (__bridge void *)(self), NULL, NULL, NULL};
self.sock = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketDataCallBack|kCFSocketConnectCallBack, *(CFSocketCallBack)takeCallback, &ctxt);
然后在回调中我把它:
static void takeCallback(CFSocketRef s, CFSocketCallBackType callbackType, CFDataRef address, const void *data, void *info)
{
PUFTransCont* obj = (__bridge PUFTransCont *)(info);
}
我看到Apple样本代码执行此操作,并在互联网上看到样本执行此操作。当我这样做时,为什么它不起作用。每当执行命中
PUFTransCont* obj = (__bridge PUFTransCont *)(info);
我得到一个EXC_BAD_ACCESS
答案 0 :(得分:4)
您的代码看起来没问题,但您必须确保PUFTransCont
对象未被取消分配
只要它被回调函数使用。
一种可能的解决方案是在套接字时保持对对象的强引用 正在使用(假设你用ARC编译)。
另一种可能的解决方案是使用
转移所有权CFSocketContext ctxt = {0, CFBridgingRetain(self), NULL, NULL, NULL};
(增加了对象的保留计数),并在以后释放它 不再需要object,例如在使用
的回调中CFRelease(info);