如何在ARC下将目标c对象的地址转换为void * volatile *?

时间:2011-12-29 18:27:51

标签: objective-c cocoa pointers casting 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);

但是我收到了错误

Incompatible types casting 'NSManagedObjectContext * __strong *' to 'void **' with a __bridge cast

有没有办法先进行转换然后获取转换指针的地址?

修改

更具体地说,我正在尝试实现另一个stackoverflow question中描述的单例模式,但是我无法将目标c NSManagedObjectContext对象的地址输入到第三个参数中。 ARC环境中的以下功能。

OSAtomicCompareAndSwapPtrBarrier(void *__oldValue, void *__newValue, void *volatile *__theValue)

1 个答案:

答案 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)中的表现一致。