Copy和MUTableCopy
在这之前先了解几个基本概念:
浅复制:指针复制(所谓指针复制,指两个指针指向同一块内存),并没有进行对象复制
单层深复制:对于集合类所说的,指的是只复制了该集合类的最外层,里面的元素没有复制(即两个集合类的地址不一样,但是两个集合里所存储的元素的地址是一样的)
完全复制:指的是完全复制整个集合类,也就是说两个集合地址不一样,里面所存储的元素地址也不一样
非集合类(NSString之类)
[immutableObject copy] //浅复制
[immutableObject mutableCopy] //深复制
[mutableObject copy] //深复制
[mutableObject mutableCopy] //深复制
结论:不可变进行copy是浅复制,mutableCopy是深复制。可变:copy和mutableCopy都是深复制
集合类(NSArray之类)
[immutableObject copy] //浅复制
[immutableObject mutableCopy] //单层深复制
[mutableObject copy] //单层深复制
[mutableObject mutableCopy] //单层深复制
结论:不可变copy是浅复制,mutableCopy是单层深复制。可变:copy和mutableCopy都是单层深复制
那么,如何实现多层深复制呢?
NSArray *copyArray = [[NSArray alloc] initWithArray:array copyItems:YES]; // 完全复制
需要注意的是:
以上所说的两种情况默认都实现了NSCopying和NSMutableCopying协议,对于自定义继承NSObject的类,需要实现以下方法,否则copy会导致crash
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;
· }