我有一个功能:
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()
and CFBridgingRelease()
是围绕编译器属性的宏。请随意使用。我喜欢 API 变体,因为它在我们的代码库中更常用,而且更明确/更少混乱。
CFBridgingRetain()
有效地硬保留必须通过平衡来平衡的物体CFBridgingRelease()
。它也恰好返回一个CFTypeRef
which is与强制转换兼容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);
}
请注意,如果您省略了强制转换/API 调用,Xcode 会很好地准确地建议您应该做什么。它甚至解释了每个替代解决方案的含义(我非常依赖这一点,直到我能够将它们牢记在心)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)