Ios 使用ObjC块作为CGDataProviderCreateWithData的回调

Ios 使用ObjC块作为CGDataProviderCreateWithData的回调,ios,objective-c,syntax,core-graphics,objective-c-blocks,Ios,Objective C,Syntax,Core Graphics,Objective C Blocks,我们希望使用参数列表中右侧定义的releaseData回调调用CGDataProviderCreateWithData()。我们怎么做 我尝试了一系列选项,但无法破解这种情况下的块语法 以下是: const CGDataProviderRef provider = CGDataProviderCreateWithData( NULL, outputPixelDataBytes, pixelsSize, ^void(void * __nullable info, c

我们希望使用参数列表中右侧定义的
releaseData
回调调用
CGDataProviderCreateWithData()
。我们怎么做

我尝试了一系列选项,但无法破解这种情况下的块语法

以下是:

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*\u Nullable,const void*\u Nonnull,unsigned long)”)


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

CGDataProviderCreateWithData()
不使用块,而是使用函数指针,这是一种不同的类型。你不能像你正在尝试的那样定义一个内联函数。您必须定义函数并传递其地址:

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

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

谢谢你的回答!我完全按照您的建议做了,但现在它说:
不兼容的指针类型将类型为'void(void*,void*,size_t)'(也称为'void(void*,void*,unsigned long)'的可保留参数传递给期望为'CGDataProviderReleaseDataCallback _Nullable'(也称为'void(*)(void*,const void*,unnull*,unsigned long)的CF函数键入
。同样,我不知道如何修复它…我的错误是信任文档而不是头文件。我已经编辑了我的答案,修复了
MyReleaseCallback()
函数的签名,以匹配
CGDataProviderReleaseDataCallback
的实际声明。谢谢!现在正在编译。天哪,ObjC语法简直是胡说八道。仍然困扰我的是
free()
行上的警告。这是因为我们不能在
const void*data
param声明中删除
const
,因为这将导致相同的编译错误。甚至不知道为什么在他们的源代码中声明为
const
,因为明确地说:
此时您可以安全地修改、移动或发布提供商数据。
显然,manual cast是我们与Apple API最好的朋友。这不是ObjC,而是直接的C,是的,函数指针一直有点。。。。乏味的。:)