iPhone SDK 非原子和原子

标签 iphone objective-c variables

非常快速和简单的问题:在 Objective-C 中,非原子和原子之间有什么区别?就像声明“@property(非原子,保留)id 对象”这样的属性时?

最佳答案

非原子保留 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 并在调用者有机会保留该对象之前释放该对象,则由于自动释放池拥有所有权,因此这并不重要。

关于iPhone SDK 非原子和原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3623649/

相关文章:

ios - GLKQuaternion 无法正确访问 w 变量

objective-c - -[NSNull objectForKeyedSubscript :]: unrecognized selector sent to instance

ios - 定义ivar的最佳方式是什么?

Swift 设置一个全局变量

iphone - 在 UIView 上滚动有图案的背景

iphone - 如何将数字画成圆形?

iPhone objective-c 颜色

regex - 脚本 : regex works in :s but not in substitute()

php - 将 PHP MySQL 查询输出转换为变量

iphone - 检测是否在 Cocos2d-iphone 上触摸了特定的 Sprite