我有一个简单的客观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);
但是我收到了错误
Incompatible types casting 'NSManagedObjectContext * __strong *' to 'void **' with a __bridge cast
有没有办法先进行转换然后获取转换指针的地址?
修改
更具体地说,我正在尝试实现另一个stackoverflow question中描述的单例模式,但是我无法将目标c NSManagedObjectContext
对象的地址输入到第三个参数中。 ARC环境中的以下功能。
OSAtomicCompareAndSwapPtrBarrier(void *__oldValue, void *__newValue, void *volatile *__theValue)
答案 0 :(得分:5)
我在现代时代看到/使用过的另一种现代单身模式使用了GCD的dispatch_once。你直接询问了关于ARC的指针转换(以及下面的更多内容),但是为了满足你的实际需求,为什么不用GCD呢?像这样:
+ (NSFoo*)sharedFoo
{
static dispatch_once_t pred;
static NSFoo* sFoo;
dispatch_once(&pred, ^{ sFoo = [[NSFoo alloc] init]; } );
return sFoo;
}
正如您所看到的,如果您查看the source的dispatch_once,GCD会实现您想要在此处实现的相同模式。 GCD通过不使用ARC跟踪指针作为CompareAndSwaps的问题解决了你遇到的问题,而是使用代理值(这里是pred
),所以即使你有一些厌恶使用GCD为你的单身,你可能会考虑模仿他们的方法并使用代理人。
那就是说,如果你只是为你的情况使用GCD,你就不必担心像粗糙的ARC指针转换之类的东西。您还可以合理地确定GCD实现在多个平台/体系结构(MacOS / iOS)中的表现一致。