iOS开发 - copy与mutableCopy不搞清楚容易出b
一、copy浅拷贝
copy (是
NSCopying
协议的方法)
返回的对象是通过调用copyWithZone: (返回一个新的实例,这个实例是接收器的副本)
这个方法返回的
拷贝的是指针地址,拷贝出来的对象与源对象地址一致! 这意味着我修改拷贝对象的值会直接影响到源对象
二、mutableCopy深拷贝
mutableCopy(是
NSMutableCopying
协议的方法)
通过mutableCopyWithZone:
返回一个新的实例,这是一个可变的接收器的副本
只有定义“不可变与可变”区别的类才应采用此协议(NSMutableCopying协议)即只有定义不可变与可变区别的类,才可以使用mutableCopy
拷贝出来的对象与源对象地址不一致! 这意味着我修改拷贝对象的值对源对象的值没有任何影响
copy就是浅拷贝, mutableCopy就是深拷贝这种认识是片面的
事实上copy也可以是深拷贝。可变对象进行copy,会产生新的对象地址,而不是新的指针地址。,mutableCopy也未必全都是深复制
细节来了
对于
NSArray、NSDictionary、NSSet
容器类型的对象,深拷贝可分为:"不完全深拷贝"和"完全深拷贝"。
不完全深拷贝:拷贝出来的容器是新的对象,但是容器里面的对象还是原来对象
完全深拷贝:拷贝出来的容器是新的对象,容器里面的对象也是新对象
三、对照表
非容器类
对象类型 | 不可变对象 | 可变对象 |
---|---|---|
copy | 浅拷贝 | 深拷贝 |
mutableCopy | 深拷贝 | 深拷贝 |
对照举例:
NSString 类型:string
string.copy:返回NSString类型的 (浅拷贝)
string.mutableCopy:返回NSMutableString类型 (深拷贝)
NSMutableString类型:muString
muString.copy:返回NSMutableString类型的 ( 深拷贝)
muString.mutableCopy:返回NSMutableString类型 (深拷贝)
容器类
对象类型 | 不可变对象 | 可变对象 |
---|---|---|
copy | 浅拷贝 | 深拷贝 |
mutableCopy | 深拷贝 | 深拷贝 |
对照举例:
NSArray类型的数组:arr
arr.copy:返回NSArray类型 (浅拷贝)
arr.mutableCopy:返回NSMutableArray类型 (深拷贝)
NSMutableArray类型的数组:muArr
muArr.copy:返回NSArray类型 ( 深拷贝)
muArr.mutableCopy:返回NSMutableArray类型 (深拷贝)