将CFSocket上下文转换为指针

时间:2014-03-01 06:16:46

标签: 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)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

1 个答案:

答案 0 :(得分:4)

您的代码看起来没问题,但您必须确保PUFTransCont对象未被取消分配 只要它被回调函数使用。

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

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

转移所有权
CFSocketContext ctxt = {0, CFBridgingRetain(self), NULL, NULL, NULL};

(增加了对象的保留计数),并在以后释放它 不再需要object,例如在使用

的回调中
CFRelease(info);