copy相关知识点
- copy 和 mutableCopy 都是创建副本,只是copy创建的是不可变副本,mutableCopy创建的是可变副本
- 深拷贝:内容拷贝,是两个对象,改变其中一个不会影响另一个
- 浅拷贝:指针拷贝,是一个对象,引用计数器加一,改变其中一个会影响另一个
只有当不可变对象创建不可变副本的时候是浅拷贝,其他的都是深拷贝
只有NSString、NSArray、NSDictionary执行copy操作时才是浅拷贝
自定义类实现copy、mutableCopy操作
- 让类遵守<NSCopying, NSMutableCopying>
- 让类显示相应的方法
- (id)copyWithZone:(NSZone *)zone
{
// 1.创建一个新的对象
Person *p = [[[self class] allocWithZone:zone] init];
// 2.设置当前对象的内容给新的对象
p.name = _name;
// 3.返回新的对象
return p;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
// 1.创建一个新的对象
Person *p = [[[self class] allocWithZone:zone] init];
// 2.设置当前对象的内容给新的对象
p.name = _name;
// 3.返回新的对象
return p;
}
- 需要注意一点,当子类也需要实现copy、mutableCopy操作的时候
- 由于父类遵守了协议,并且实现了方法,只需要在子类中重写方法就可以了
- (id)copyWithZone:(NSZone *)zone
{
// 1.创建副本
id obj = [super copyWithZone:zone];
// 2.设置数据给副本
// 这里设置的数据是子类独有的属性,父类的属性已经在上一句代码中完成了
[obj setHeight:_height];
// 3.返回副本
return obj;
}
网友评论