【问题标题】:Converting CFSocket context to pointer将 CFSocket 上下文转换为指针
【发布时间】:2014-03-01 06:16:45
【问题描述】:

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

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

【问题讨论】:

    标签: ios objective-c casting exc-bad-access cfsocket


    【解决方案1】:

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

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

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

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

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

    CFRelease(info);
    

    【讨论】:

    • 在回调发生前被释放。我解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2012-10-24
    • 2017-02-12
    • 1970-01-01
    • 2021-09-20
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多