Ton*_*ony 3 cocoa pointers casting objective-c automatic-ref-counting
我有一个简单的客观c对象
NSManagedObjectContext * moc = nil
现在我需要将它传递给接受类型参数的ARC环境中的函数
void *volatile * value
我试过了
&((__bridge void *)moc))
但是我得到以下编译器错误
Address expression must be lvalue or a function pointer
我也试过了
void ** addr = (__bridge void **)(&moc);
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误
Incompatible types casting 'NSManagedObjectContext * __strong *' to 'void **' with a __bridge cast
有没有办法先进行转换然后获取转换指针的地址?
编辑
更具体地说,我正在尝试实现另一个stackoverflow问题中描述的单例模式,但是我无法NSManagedObjectContext在ARC环境中将目标c 对象的地址输入到以下函数的第三个参数中.
OSAtomicCompareAndSwapPtrBarrier(void *__oldValue, void *__newValue, void *volatile *__theValue)
我在现代时代看到/使用过的另一种现代单身模式使用了GCD的dispatch_once.你直接询问了关于ARC的指针转换(以及下面的更多内容),但是为了满足你的实际需求,为什么不用GCD呢?像这样:
+ (NSFoo*)sharedFoo
{
static dispatch_once_t pred;
static NSFoo* sFoo;
dispatch_once(&pred, ^{ sFoo = [[NSFoo alloc] init]; } );
return sFoo;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,如果您查看dispatch_once 的源代码,GCD将实现您在此处实现的相同模式.GCD通过不使用ARC跟踪指针作为CompareAndSwaps的问题解决了你遇到的问题,而是使用代理值(这里pred),所以即使你有一些厌恶使用GCD为你的单身人士,你可能会考虑模仿他们的方法并使用代理人.
也就是说,如果你只是为你的情况使用GCD,你就不必担心像粗糙的ARC指针铸造这样的东西.您还可以合理地确定GCD实现在多个平台/体系结构(MacOS/iOS)中的表现一致.