关于C:iPhone SDK非原子和原子Nonatomic and Atomic

iPhone SDK Nonatomic and Atomic

真正的快速和简单的问题:是什么在Objective - C的无原子和原子之间的差异?当declaring样样性质的""(,,等,保持物业)对象"?


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

1
2
3
4
5
6
7
8
9
10
11
-(id) foo
{
    return fooIvar;
}

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-(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并在调用方有机会保留它之前释放该对象,则无需考虑自动释放池的所有权。


非原子-无头,但不线程安全。