iOS开发 - copy与mutableCopy不搞清楚容易出b

2021-12-29  本文已影响0人  俺不是大佬儿

一、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类型 (深拷贝)


\color{gray}{只是因为在这个问题上栽了一下,顺便总结记录下来}

\color{gray}{欢迎大佬儿来指正纠错,共同学习😏!!}

上一篇下一篇

猜你喜欢

热点阅读