Ios 将CFSocket上下文转换为指针

Ios 将CFSocket上下文转换为指针,ios,objective-c,casting,exc-bad-access,cfsocket,Ios,Objective C,Casting,Exc Bad Access,Cfsocket,我将上下文设置为创建套接字的类的地址,如下所示: CFSocketContext ctxt = {0, (__bridge void *)(self), NULL, NULL, NULL}; self.sock = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketDataCallBack|kCFSocketConnectCallBack, *(CFSocketCallBack

我将上下文设置为创建套接字的类的地址,如下所示:

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);

}
我看到了苹果的示例代码,也看到了互联网上的示例。为什么我这么做的时候它不起作用。只要执行成功

PUFTransCont* obj = (__bridge PUFTransCont *)(info);

我获得了一个EXC_BAD_访问权限

您的代码看起来正常,但您必须确保未解除分配
PUFTransCont
对象 只要回调函数使用它

一种可能的解决方案是在套接字运行时保持对对象的强引用 正在使用中(假设使用ARC编译)

另一种可能的解决方案是使用

CFSocketContext ctxt = {0, CFBridgingRetain(self), NULL, NULL, NULL};
(这会增加对象的保留计数),并在 对象不再需要,例如在具有

CFRelease(info);

代码看起来正常,但必须确保未解除分配
PUFTransCont
对象 只要回调函数使用它

一种可能的解决方案是在套接字运行时保持对对象的强引用 正在使用中(假设使用ARC编译)

另一种可能的解决方案是使用

CFSocketContext ctxt = {0, CFBridgingRetain(self), NULL, NULL, NULL};
(这会增加对象的保留计数),并在 对象不再需要,例如在具有

CFRelease(info);

它在回调发生之前被解除分配。我修复了该问题。在回调发生之前已解除分配。我解决了这个问题。