Objective-C 之 @property

@property属性值三类分别是:原子性访问器控制内存管理

原子性

atomic(默认):

atomic意为操作是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的至少在当前的访器上我是安全的。它是一个默认的,但是很少使用。它的比较慢,这跟ARM平台和内部锁机制有关。

nonatomic:

nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问。它的速度比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。

访问器控制

readwrite

readonly

内存管理

retain

使用了retain意味着实例变量要获取传入参数的所有权。具体表现在setter中对实例变量先release然后将参数 retain之后传给它。下面这段代码展示了retain类似的行为:

1
2
3
4
5
6
7
8
-(void)setStuName:(NSString *)stuName
{
if (_stuName != stuName)
{
[_stuName release];
_stuName = [stuName retain];
}
}

assign

用于值类型,如int、float、double和NSInteger,CGFloat等表示单纯的复制。还包括不存在所有权关系的对象,比如常见的delegate。

strong

是在ARC伴随IOS引入的时候引入的关键字是retain的一个可选的替代。表示实例变量对传入的参数要有所有权关系即强引用。strong跟retain的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系。

weak

weak跟assign的效果相似,不同的是weak在对象被回收之后自动设置为nil。而且weak智能用在iOS 5或以后的版本,对于之前的版本,使用unsafe_unretained。

unsafe_unretained

weak的低版本替代。

copy

查看上一篇深浅复制

补充:

NSString 应用 retain 还是 copy

  1. 对NSString应用retain,效率无疑是最好的

  2. 用copy最安全,因为NSString 为 NSMutableString 的基类,如果将NSMutableString 以retain的形式赋值给NSString后,后续修改NSMutableString会导致NSString内容的变化,这通常不是我们希望的,所以用copy最安全。

  3. 到底用哪个?貌似还是用copy,因为copy并不一定导致一个新对对象创建,而牺牲效率。copy会调用NSCopying中的 -(id)copyWithZone:(NSZone *),我们可以判断下self是NSString还是NSMutableString,如果是NSString,就地[self retain],[return self]。否则老老实实拷贝对象赋值,这样可以实现效率和安全的结合

copy到底是深复制还是浅复制仅仅由NSCopying中的 copyWithZone 来决定