2

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

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

4

1 回答 1

4

您的代码看起来不错,但您必须确保 只要回调函数使用该PUFTransCont对象就不会被释放。

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

另一种可能的解决方案是转让所有权

CFSocketContext ctxt = {0, CFBridgingRetain(self), NULL, NULL, NULL};

(这会增加对象的保留计数),并在以后不再需要对象时释放它,例如在回调中使用

CFRelease(info);
于 2014-03-01T08:47:13.783 回答