当我们使用自定义对象的 copy 方法时会报错,例如我们自定了一个 Person 类并实例化一个对象,并调用其 copy 方法:
Person *p = [Person new];
p.name = @"小明";
Person *p1 = [p copy];
当执行到 [p copy] 时,将会报错,错误如下:
-[Person copyWithZone:]: unrecognized selector sent to instance 0x100612d20
原因是没有实现 copyWithZone 方法,是因为在 copy 方法中调用了 copyWithZone 方法,所以必须实现 copyWithZone 方法才能够使用 copy 方法。
要实现 copyWithZone 方法,我们首先需要在 Person.h 文件中让 Person 类遵循 NSCopying 协议
@interface Person : NSObject <NSCopying>
然后在 Person.m 文件中实现 copyWithZone 方法:
- (id)copyWithZone:(nullable NSZone *)zone;
- (id)copyWithZone:(NSZone *)zone{
// 如果不实现下面的代码将会变成浅拷贝
Person *copy = [[[self class]allocWithZone:zone]init];
copy.name = self.name;
return copy;
}
实现后运行以下代码:
Person *p = [Person new];
p.name = @"小明";
Person *p1 = [p copy];
NSLog(@"%p,%p,%@,%@",p,p1,p.name,p1.name);
打印的结果是
0x1006562b0,0x10065a490,小明,小明
可以看出通过以上代码调用 copy 方法拷贝是深拷贝。