iPhone SDK Nonatomic和Atomic

时间:2010-09-02 03:32:29

标签: iphone objective-c variables

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

2 个答案:

答案 0 :(得分:5)

非原子保留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返回引用和调用者之间保留它(或做其他任何事情)另一个线程可以调用安装者,释放物体并可能解除分配。

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

答案 1 :(得分:2)

非原子 - 少于头但不是线程安全。