【发布时间】:2014-06-02 12:56:07
【问题描述】:
我终于将我的旧项目更新为 ARC,除了我的 3 个单例类之外,一切正常。现在,如果我只是从 ARC 中排除这 3 个类,它就可以工作,但我实际上希望它们使用 ARC 工作。
我的旧代码是这样的:
static void * volatile session = nil;
+ (DNWSession*)session
{
while(!session)
{
DNWSession *tmpSession = [self new];
if(!OSAtomicCompareAndSwapPtrBarrier(0, tmpSession, &session))
[tmpSession release];
}
return session;
}
为了使用 ARC,我将代码转换为:
static void * volatile session = nil;
+ (DNWSession*)session
{
while(!session)
{
DNWSession *tmpSession = [self new];
if(!OSAtomicCompareAndSwapPtrBarrier(0, (__bridge void *)(tmpSession), &session))
}
return (__bridge DNWSession *)(session);
}
但是当从主线程调用这个类的会话时,我的应用程序崩溃并给我一个 EXC_BAD_ACCESS(代码=1,地址=xxx),我真的不知道为什么会这样。
如何使这部分与 ARC 一起使用?
编辑
我试过只创建一个没有 if 语句的新会话,但这也给了我同样的错误
+ (DNWSession*)session
{
while(!session)
{
session = (__bridge void *)([self new]);
/*DNWSession *tmpSession = [self new];
if(!OSAtomicCompareAndSwapPtrBarrier(0, (__bridge void *)(tmpSession), &session))
;*/
}
return (__bridge DNWSession *)(session);
}
【问题讨论】:
-
您的新代码似乎在
if之后缺少一条语句。 -
Hmm.. 所以 Xcode 刚刚删除了发布行。我懂了。所以整个 OSAtomicCompareAndSwapPtrBarrier 部分在 ARC 中变得没用了?
-
我不认为它已经变得完全没用了,但是在这种情况下它绝对不是太有用。整个解决方案一开始就不太理想,因为它可能导致创建多个
[self new]实例,其中只有一个实例最终会“存活”。这是因为在这种方法中,新实例是“主动”构建的。我更喜欢Objective-C中单例的this implementation,它没有这个缺点。 -
这就是我不喜欢 ARC 的原因。试试
__bridge_retained而不是__bridge -
感谢您的帮助和解释。
标签: objective-c xcode singleton automatic-ref-counting