ObjC的Retain的属性跟Copy的区别
ObjC的Retain的属性和Copy的区别
1
,可读性:
readonly
、
readwrite
@property(readwrite,....) valueType value;
这个属性是变量的默认属性,就是如果你
(readwrite and readonly
都没有使用,那么你的变量就是
readwrite
属性
)
,通过加入
readwrite
属性你的变量就会有
get
方法,和
set
方法。
property(readonly,...) valueType value;
这个属性变量就是表明变量只有可读方法,也就是说,你只能使用它的
get
方法。
2
,
assign
,
setter
方法直接赋值,不进行任何
retain
操作,为了解决原类型与环循引用问题
3
,
retain
,
setter
方法对参数进行
release
旧值再
retain
新值,所有实现都是这个顺序
4
,
copy
,
setter
方法进行
Copy
操作,与
retain
处理流程一样,先旧值
release
,再
Copy
出新的对象,
retainCount
为
1
。这是为了减少对上下文的依赖而引入的机制。
5
,
nonatomic
,非原子性访问,不加同步,多线程并发访问会提高性能。
注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级
。
所以
不加
nonatomic
对与多线程是安全的
。
附网文:
Retain vs. Copy
copy
:
建立一个索引计数为
1
的对象,然后释放旧对象
retain
:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为
1
那上面的是什么该死的意思呢?
Copy
其实是建立了一个相同的对象,而
retain
不是:
比如一个
NSString
对象,地址为
0×1111
,内容为
@”STR”
Copy
到另外一个
NSString
之后,地址为
0×2222
,内容相同,新的对象
retain
为
1
,旧有对象没有变化
retain
到另外一个
NSString
之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的
retain
值
+1
也就是说,
retain
是指针拷贝,
copy
是内容拷贝。