gpt4 book ai didi

objective-c - 如何在 ARC 下将 objective c 对象的地址获取到 void * volatile * 中?

转载 作者:搜寻专家 更新时间:2023-10-30 20:03:43 25 4
gpt4 key购买 nike

我有一个简单的 objective c 对象

NSManagedObjectContext * moc = nil

现在我需要将它传递给 ARC 环境中接受类型参数的函数

void *volatile * 值

我试过了

&((__bridge void *)moc))

但我得到以下编译器错误

地址表达式必须是左值或函数指针

我也试过

void ** addr = (__bridge void **)(&moc);

但是我得到了错误

使用 __bridge 转换将“NSManagedObjectContext * __strong *”转换为“void **”的不兼容类型

有没有办法先强制转换,然后获取强制转换的指针的地址?

编辑

更具体地说,我正在尝试实现另一个 stackoverflow question 中描述的单例模式, 但我无法将 objective-c NSManagedObjectContext 对象的地址提供给 ARC 环境中以下函数的第三个参数。

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;
}

如你所见,如果你去看看 the source对于 dispatch_once,GCD 实现了您要在此处实现的相同模式。 GCD 通过不使用 ARC 跟踪指针作为它的 CompareAndSwaps 来解决您遇到的问题,而是使用代理值(此处 pred),所以即使您对使用有一些反感GCD 对于您的单例,您可以考虑模仿他们的方法并使用代理人。

就是说,如果您只是针对您的情况使用 GCD,那么您永远不必担心诸如粗糙的 ARC 指针转换之类的问题。您还可以合理地确定 GCD 实现将在多个平台/架构 (MacOS/iOS) 中保持一致的行为。

关于objective-c - 如何在 ARC 下将 objective c 对象的地址获取到 void * volatile * 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8671784/

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