【发布时间】:2011-03-20 22:05:09
【问题描述】:
我只是想知道这两行代码有什么区别:
@property(nonatomic, retain) NSString *str;
和
@property(atomic, retain) NSString *str;
谢谢, 问候, tek3
【问题讨论】:
标签: objective-c
我只是想知道这两行代码有什么区别:
@property(nonatomic, retain) NSString *str;
和
@property(atomic, retain) NSString *str;
谢谢, 问候, tek3
【问题讨论】:
标签: objective-c
在引用计数的多线程环境中,原子属性是必需的,以便在线程有机会保留对象之前阻止对象消失。
考虑 get 访问器的简单实现:
@interface MyObject : NSObject
{
id myPropertyIVar;
}
-(id) myProperty;
@end
@implementation MyObject
-(id) myProperty
{
return myPropertyIvar;
}
// other stuff
@end
这一切都很好,除了如果您在保留来自 -myProperty 的返回值之前释放 MyObject 的实例,则返回的值很可能会被释放。因此,像这样实现 -myProperty 会更安全:
-(id) myProperty
{
return [[myPropertyIvar retain] autorelease];
}
现在这在单线程环境中是完全安全的。
不幸的是,在多线程环境中存在竞争条件。如果线程在保留增加保留计数之前的任何时间被中断,以下任一情况都会导致您收到垃圾指针:
因此,对属性的所有访问都必须受到锁的保护。 get 访问器看起来像这样。
-(id) myProperty
{
// lock
return [[myPropertyIvar retain] autorelease];
// unlock
}
set 访问器受到类似保护,-dealloc 中的释放也是如此
【讨论】:
Apple 文档很好地解释了这一切。要了解属性,包括它们的原子性,请阅读this page。
【讨论】: