用ARC返回单例

时间:2014-06-02 12:56:08

标签: objective-c xcode singleton automatic-ref-counting

我终于将我的旧项目更新为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);
}

1 个答案:

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