关于深copy和浅copy
2019-11-28 本文已影响0人
张_何
深copy
- 所谓深copy是指内容copy
浅copy
- 所谓浅copy是指指针copy
集合的单层深copy
- 在多层数组中,对第一层进行内容拷贝,其它层进行指针拷贝
自定义对象的copy
- 对于自定义对象如果声明属性使用了copy字段,或者自定义对象调用copy方法时,都需要改对象类型遵守NSCopying协议,并实现copyWithZone方法
- 对于浅copy,copyWithZone方法实现如下
-(id)copyWithZone:(NSZone *)zone {
// 浅copy
return self;
}
- 对于深copy, copyWithZone方法实现如下
-(id)copyWithZone:(NSZone *)zone {
// 深copy
SomeClass *copy = [[self class] allocWithZone:zone];
// 对属性进行copy
copy.*** = self.***;
return copy;
}
image.png
当我们使用copy声明属性的时候,如果没有实现copyWithZone方法会崩溃,图中14行会崩溃,
当我们对集合进行深copy的时候,同样集合里的元素类型也要实现copyWithZone方法,否则同样会崩溃,图中46 行会崩溃,此时对copyWithZone方法里面的实现没有要求,既可以是浅copy的实现,也可以是深copy的实现,但是既然是要深copy集合,最好实现深copy
当我们修改Person类的copyWithZone的实现改为浅copy,此时p1 的retainCount 会变为4, p2的retainCount 会变为3
2019-11-28 17:30:18.516735+0800 ObjcCode[89781:16260783] p1 retainCount 4
2019-11-28 17:30:18.516935+0800 ObjcCode[89781:16260783] p2 retainCount 3