【问题标题】:return singleton with ARC使用 ARC 返回单例
【发布时间】: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


【解决方案1】:

使用dispatch_once_t 创建单例:

+ (instancetype)sharedInstance {
    static dispatch_once_t once;
    static id _sharedInstance = nil;
    dispatch_once(&once, ^{
        _sharedInstance = [[self alloc] init];
    });

    return _sharedInstance;
}

【讨论】:

  • 太好了,这似乎有效。我将尝试实现这一点,然后返回此处接受您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 2011-12-18
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多