前言
首先我们要先明白一个概念,什么是浅复制,单层深复制,完全复制(每一层都深复制)
浅复制也就是所说的指针复制,并没有进行对象复制
单层深复制,也就是我们经常说的深复制,我这里说的单层深复制是对于集合类所说的(即NSArray,NSDictionary,NSSet),单层深复制指的是只复制了该集合类的最外层,里边的元素没有复制,(即这两个集合类的地址不一样,但是两个集合里所存储的元素的地址是一样的)
完全复制,指的是完全复制整个集合类,也就是说两个集合地址不一样,里边所存储的元素地址也不一样
明白了这三个概念之后,我们就来说一下他们的区别所在:
- 非集合类(NSString,NSNumber)
[immutableObject copy] //浅复制
[immutableObject mutableCopy] //深复制
[mutableObject copy] //深复制
[mutableObject mutableCopy] //深复制
结论:不可变进行copy是浅复制,mutableCopy是深复制,可变的copy,mutableCopy都是深复制
- 集合类(NSArray,NSDictionary, NSSet)
[immutableObject copy] //浅复制
[immutableObject mutableCopy] //单层深复制
[mutableObject copy] //单层深复制
[mutableObject mutableCopy] //单层深复制
结论:不可变进行copy是浅复制,mutableCopy是单层深复制,可变的copy,mutableCopy都是单层深复制
那么如何实现多层复制呢?
我们以NSArray举例说明
NSArray *copyArray = [[NSArray alloc] initWithArray:array copyItems:YES]; // 完全复制
需要特别注意的是
以上我们所说的两种情况默认都实现了NSCopying和NSMutableCopying协议
对于自定义继承自NSObject的类
- copy需要实现NSCopying协议,然后实现以下方法,否则copy会crash
-(id)copyWithZone:(NSZone *)zone {
CopyObject *copy = [[[self class] alloc] init];
copy.name = self.name;
copy.mobile = self.mobile;
copy.company = self.company;
copy.descInfo = self.descInfo;
return copy;
}
- mutableCopy时,需要实现NSMutableCopying协议,否则mutableCopy会crash
-(id)mutableCopyWithZone:(NSZone *)zone {
MutableCopyObject *mutableCopy = [[[self class] alloc] init];
mutableCopy.name = self.name;
mutableCopy.mobile = self.mobile;
mutableCopy.company = self.company;
mutableCopy.descInfo = self.descInfo;
return mutableCopy;
}