Noo*_*ath 2 iphone variables objective-c
真正快速而简单的问题:在Objective-C中,非原子和原子有什么区别?比如声明像"@property(nonatomic,retain)id object"这样的属性时?
非原子保留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池具有所有权而无关紧要.
| 归档时间: |
|
| 查看次数: |
5182 次 |
| 最近记录: |