gpt4 book ai didi

iPhone SDK 非原子和原子

转载 作者:行者123 更新时间:2023-12-03 20:26:32 27 4
gpt4 key购买 nike

非常快速和简单的问题:在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com