此篇文章为了纪念26K的大神
举个🌰
有一个对象,Person 里面有两个属性 name,age 假设都是字符串 这时候调用Pereson copy
要知道,自定义对象想支持copy 需要实现coping协议,实现copy函数
copyWithZone
具体是深拷贝 还是浅拷贝 就看这个函数怎么实现了
/** 浅拷贝 */
- (id)mutableCopyWithZone:(NSZone *)zone{
Person *person = [[Person allocWithZone:zone] init];
person.age = self.age;
person.name = self.name;
return person;
}
/** 深拷贝 */
- (id)mutableCopyWithZone:(NSZone *)zone{
Person *person = [[Person allocWithZone:zone] init];
person.age = [self.age copy];
person.name = [self.name copy];
//注意如果Person包含了别的自定义对象,那每个属性都要这样copy
return person;
}
不能理解的话 这里还有两张图可以看图理解一下
- 浅拷贝即使copy出一个新的对象但它的属性还是指向旧对象的内存地址
- 而深拷贝的话 就是copy出一个和旧对象一点关系都没有的新对象 保证所有属性都开辟出新的内存空间
新的Person肯定是新的对象 新的内存地址 ,这样才发生了 copy 行为,像网上说的没有新内存地址那个不叫拷贝,那叫赋值
总结:
1.就是深拷贝是完整的复制了一个人,这个人复制出来就和本人没关系了,各自修改属性啥的都不影响
2.而浅拷贝可能会受到本人的改变而改变,因为他的各种属性还是指向本人的内存地址
系统级的函数 都是浅拷贝
所有集合类API 都是浅拷贝