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);
它在回调发生之前被解除分配。我修复了该问题。在回调发生之前已解除分配。我解决了这个问题。