【问题标题】:iOS class property not accessible in CFSocketCallback在 CFSocketCallback 中无法访问 iOS 类属性
【发布时间】:2014-12-17 09:31:17
【问题描述】:

我有一个 CFSocket 回调方法,声明如下:

void socketCallback(CFSocketRef cfSocket, CFSocketCallBackType type, CFDataRef address, const void *data, void *userInfo)
{
    if (_scanningInProgress) {

    }
}

问题是我收到“使用未声明的标识符'_scanningInProgress'错误。我有点困惑,因为如果我尝试这样的事情:

-(void)scan:(bool)isScanning
{
    _scanningInProgress = isScanning;
}

然后一切正常。是什么导致了错误?这是该属性的 .h 文件声明:

@property bool scanningInProgress;

【问题讨论】:

    标签: ios objective-c c cfsocket


    【解决方案1】:

    问题是您正在使用 Objective-C 中的 C API,并且任何回调功能都需要传递一些信息,以便回调函数能够理解它被调用的上下文。在您的情况下,您需要在CFSocketContext 结构中传递Objective-C 对象引用并从info 参数(最后一个)访问它:

    创建套接字时:

    const CFSocketContext context = { 0, self, NULL, NULL, NULL };
    socket = CFSocketCreateWithNative(NULL, sock, kCFSocketReadCallBack,
                                      socketCallback, &context);
    

    并在回调方法中访问它:

    void socketCallback(CFSocketRef cfSocket, CFSocketCallBackType type,
                        CFDataRef address, const void *data, void *info)
    {
        YourObject *obj = (YourObject *)info;
        if (obj.scanningInProgress) {
    
        }
    }
    

    (您可能需要一些桥接指令才能在没有错误或警告的情况下进行编译;在撰写本文时我无法对其进行测试)。

    【讨论】:

    • 是的,谢谢,就是这样。 CFSocketContext 中需要一些桥接,但 Xcode 处理得很好。
    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多