【问题标题】:Use an ObjC Block as a callback for CGDataProviderCreateWithData使用 ObjC 块作为 CGDataProviderCreateWithData 的回调
【发布时间】:2018-03-12 19:42:37
【问题描述】:

我们想调用CGDataProviderCreateWithData(),并在参数列表中定义了releaseData 回调。我们该怎么做?

我尝试了很多选项,但无法破解这种情况下的块语法。

以下内容:

const CGDataProviderRef provider = CGDataProviderCreateWithData(
    NULL,
    outputPixelDataBytes,
    pixelsSize,
    ^void(void * __nullable info, const void * data, size_t size) {
        free(data);
    });

无法编译并出现错误:

将 'void (^)(void * _Nullable, const void , size_t)' 传递给 不兼容类型的参数'CGDataProviderReleaseDataCallback _Nullable' (又名'void ()(void * _Nullable, const void * _Nonnull, unsigned long)')

不确定要更改什么来消除错误。

【问题讨论】:

    标签: ios objective-c syntax core-graphics objective-c-blocks


    【解决方案1】:

    CGDataProviderCreateWithData() 不带块,它带函数指针,这是不同类型的东西。你不能像你试图做的那样定义一个内联函数。您将必须在外线定义函数并传递其地址:

    static void MyReleaseCallback(void * __nullable info, const void *  data, size_t size)
    {
        free(data);
    }
    
    ...
    {
        ...
        const CGDataProviderRef provider = CGDataProviderCreateWithData(
            NULL,
            outputPixelDataBytes,
            pixelsSize,
            MyReleaseCallback);
        ...
    }
    

    【讨论】:

    • 感谢您的回答!我完全按照你的建议做了,但现在它说:Incompatible pointer types passing retainable parameter of type 'void (void *, void *, size_t)' (aka 'void (void *, void *, unsigned long)')to a CF function expecting 'CGDataProviderReleaseDataCallback _Nullable' (aka 'void (*)(void * _Nullable, const void * _Nonnull, unsigned long)') type。同样,我不知道如何解决它......
    • 我的错误是相信文档而不是头文件。我已经编辑了我的答案以修复 MyReleaseCallback() 函数的签名以匹配 CGDataProviderReleaseDataCallback 的实际声明。
    • 谢谢!现在正在编译。天哪,ObjC 语法简直是疯了。仍然困扰我的是free() 行上的警告。这是因为我们不能在const void * data 参数声明中删除const,因为它会导致相同的编译错误。甚至不知道为什么它在他们的来源中被声明为const,因为docs 明确说:You may safely modify, move, or release your provider data at this time. 显然,手动转换是我们使用Apple API 最好的朋友。
    • 这不是 ObjC,而是纯 C,是的,函数指针总是有点……乏味。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多