深拷贝和浅拷贝是以是否产生新对象为依据的,不是以拷贝产生的副本类型为依据的。
拷贝
- 实现拷贝的方法有2个
copy
:返回不可变副本mutableCopy
:返回可变副本
- 普通对象实现拷贝的步骤
- 遵守
NSCopying
协议 - 实现
-copyWithZone:
方法- 创建新对象
- 给新对象的属性赋值
- 遵守
- copy语法目的:改变副本的时候 不会改变源对象。
深拷贝和浅拷贝
- 深拷贝 (
mutableCopy
)是内容拷贝
,会产生一个新的对象- 新对象的计数器为1,源对象不会改变
浅拷贝 (
copy
)指针拷贝
不会产生新的对象- 源对象的计数器+1 copy产生的是不可变副本
- 由于源对象本身就不可变为了性能着想,copy会直接返回源对象本身
不可变对象调用拷贝
- 浅拷贝不可变 深拷贝可变
- 可变对象 调用拷贝 都是深拷贝
- 所以只有一种情况是浅拷贝:
- 不可变对象调用copy方法时 在浅拷贝的情况下 copy就相当于retain
注意
深拷贝和浅拷贝是以是否产生新对象为一局的,不是以拷贝产生的副本类型为依据的。