iPhone SDK Nonatomic和Atomic

Noo*_*ath 2 iphone variables objective-c

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

Jer*_*myP 5

非原子保留getter和setter的代码在概念上看起来像:

-(id) foo
{
    return fooIvar;
}

-(void) setFoo: (id) newFoo
{
    [newFoo retain];
    [fooIvar release];
    fooIvar = newFoo; 
}
Run Code Online (Sandbox Code Playgroud)

原子getter和setter的代码在概念上看起来像这样:

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

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

实施细节是不同的,特别是锁定比使物体与ivar同步更轻.

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

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