【问题标题】:iPhone SDK Nonatomic and AtomiciPhone SDK 非原子和原子
【发布时间】:2010-09-02 03:32:29
【问题描述】:

真正快速而简单的问题:在 Objective-C 中,非原子和原子之间有什么区别?比如在声明“@property (nonatomic, retain) id object”之类的属性时?

【问题讨论】:

标签: iphone objective-c variables


【解决方案1】:

非原子保留 getter 和 setter 的代码在概念上类似于:

-(id) foo
{
    return fooIvar;
}

-(void) setFoo: (id) newFoo
{
    [newFoo retain];
    [fooIvar release];
    fooIvar = newFoo; 
}

原子 getter 和 setter 的代码在概念上如下所示:

-(id) foo
{
    @synchronized(self)
    {
        return [[fooIvar retain] autorelease];
    }
}

-(void) setFoo: (id) newFoo
{
    @synchronized(self)
    {
        [newFoo retain];
        [fooIvar release];
        fooIvar = newFoo;
    } 
}

实现细节有所不同,尤其是锁定比同步对象与 ivar 更轻。

在非原子情况和多线程环境中,你不能保证 getter 会给你一个有效的对象,因为在 getter 返回引用和调用者保留它(或做任何其他事情)之间,另一个线程可能会调用setter,释放对象并可能释放它。

在原子情况下,这不会发生,因为 getter 在返回之前将对象放入线程的自动释放池中。如果另一个线程在调用者有机会保留对象之前调用了 setter 并释放了该对象,这无关紧要,因为自动释放池拥有所有权。

【讨论】:

  • 我想提一下,在 atomic 的情况下你有更多的开销(如上面的代码所示),所以这就是为什么大多数人会使用 nonatomic 来声明一个简单的指针。跨度>
  • @cfarm54:在我看来,这将是过早优化的一个例子。我认为人们应该将属性保留为原子的(这符合原子是默认值的事实),除非他们可以证明存在性能问题。
【解决方案2】:

非原子 - 开销较小但不是线程安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2019-04-05
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多