使用 ObjC 块作为 CGDataProviderCreateWithData 的回调

Use an ObjC Block as a callback for CGDataProviderCreateWithData

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

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

以下:

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

没有编译错误:

Passing 'void (^)(void * _Nullable, const void , size_t)' to parameter of incompatible type 'CGDataProviderReleaseDataCallback _Nullable' (aka 'void ()(void * _Nullable, const void * _Nonnull, unsigned long)')

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

CGDataProviderCreateWithData() 不带块,它带函数指针,这是不同类型的东西。您不能像您尝试的那样定义内联函数。您将必须定义函数 out-of-line 并传递其地址:

static void MyReleaseCallback(void * __nullable info, const void *  data, size_t size)
{
    free(data);
}

...
{
    ...
    const CGDataProviderRef provider = CGDataProviderCreateWithData(
        NULL,
        outputPixelDataBytes,
        pixelsSize,
        MyReleaseCallback);
    ...
}