当我们使用自定义对象的 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
方法拷贝是深拷贝。