关键字(@property属性)(I)
2019-10-20 本文已影响0人
Harely
nonatomic和atomic
- nonatomic:不使用同步锁,非原子性
- atomic:使用同步锁,原子性
属性声明为atomic时,在该属性在调用getter和setter方法时,会加上同步锁(也叫互斥锁@synchronized)。
即在属性在调用getter和setter方法时,保证同一时刻只能有一个线程调用属性的读/写方法。保证了读和写的过程是可靠的。
但并不能保证数据一定是可靠的。
理由如下图:
数据不可靠
retain
retain到另外一个对象之后,地址是不会变化的,地址也为0x1111,实质上是建立一个指针,也就是指针拷贝,内容也是相同的,retain值会加1。
- (void)setName:(NSString *)name{
if (_name != name) {
[ _name release];
_name = [name retain];
}
}
- (NSString *)name{
return [[ _name retain] autorelease];
}
copy
copy建立一个相同的对象,如果一个NSString对象,假如地址为0x1111,内容为@"hello",通过Copy到另一个对象之后,地址为0x2322,内容也相同,而新的对象retain为1,旧的对象是不会发生变化。
内部实现
- (void)setName:(NSString *)name{
if (_name != name) {
[ _name release];
_name = [name copy];
}
}
- (NSString *)name{
return [[ _name retain] autorelease];
}
assign
内部实现
- (void)setName:(NSString *)name{
_name = name;
}
- (NSString *)name{
return _name;
}
weak