gpt4 book ai didi

objective-c - 将 Objective-C 对象作为 void * 指针传递给函数

转载 作者:太空狗 更新时间:2023-10-30 03:18:30 25 4
gpt4 key购买 nike

我有一个函数:

  myFunction (MyProc callback, void * ref)

此函数是从 Objective-C 类中调用的。向该函数传递一个指向回调(类中的函数)的指针和一个引用。引用是必需的,因为回调是静态调用的,因此没有上下文。 ref 可用于为回调提供上下文。

我希望能够传递 Objective-C 类作为引用。所以问题是:

如何将 NSObject 转换为 void * 以及如何将 void * 转换为 NSObject。

提前致谢。

最佳答案

做这样的事情:

void func(void *q)
{
NSObject* o = CFBridgingRelease(q);
NSLog(@"%@", o);
}

int main(int argc, const char * argv[])
{
@autoreleasepool {
NSObject* o = [NSObject new];
func((void*)CFBridgingRetain(o));
}
return 0;
}

请注意,CFBridgingRetain()CFBridgingRelease() 是围绕编译器属性的宏。随意使用。我喜欢 API 变体,因为它在我们的代码库中更常用,而且更明确/更少混淆。

CFBridgingRetain() 有效地硬保留必须由 CFBridgingRelease() 平衡的对象。它还恰好返回一个 CFTypeRef 与转换为 void* 兼容。 CFBridgingRelease() 有效地撤销了硬保留,因此,q 将仅在 o 有效的范围内保持有效。

对基本回调有效,但您可能不会使用必须保留一段时间的 void *context; 类型的东西。为此:

void callback(void *context)
{
// grab an ARC aware reference without impacting hard-retain
NSObject* o = (__bridge NSObject *)(context);
NSLog(@"%@", o);
}

void freeContext(void *context)
{
// release the hard-retain
CFBridgingRelease(context);
}

请注意,Xcode 非常擅长准确建议您在遗漏强制转换/API 调用时应该做什么。它甚至解释了每个替代解决方案的含义(我非常依赖它,直到我能把它们记在脑海里)。

关于objective-c - 将 Objective-C 对象作为 void * 指针传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12916491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com