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,是的,函数指针一直有点。。。。乏味的。:)