[英]Converting CFSocket context to pointer
我将上下文设置为创建套接字的类的地址,如下所示:
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示例代码,并看到了整个Internet上的示例。 为什么当我这样做时它不起作用。 每当执行命中
PUFTransCont* obj = (__bridge PUFTransCont *)(info);
我得到一个EXC_BAD_ACCESS
您的代码看起来PUFTransCont
,但是您必须确保PUFTransCont
对象不会被重新分配 ,只要它被回调函数使用即可。
一种可能的解决方案是在使用套接字时保持对对象的强烈引用(假设您使用ARC进行编译)。
另一种可能的解决方案是将所有权转让给
CFSocketContext ctxt = {0, CFBridgingRetain(self), NULL, NULL, NULL};
(这会增加对象的保留计数),然后在不再需要该对象时将其释放,例如在带有
CFRelease(info);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.