我终于将我的旧项目更新为ARC,除了我的3个单例类之外,一切正常。现在它可以工作,如果我只是从ARC中排除这三个类,但我实际上希望它们使用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);
}
答案 0 :(得分:3)
使用dispatch_once_t
:
+ (instancetype)sharedInstance {
static dispatch_once_t once;
static id _sharedInstance = nil;
dispatch_once(&once, ^{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}