NSObject类提供了两个用于拷贝的方法:- (id)copy 和- (id)mutableCopy,这两个方法都可以复制已有对象的副本。由于oc中几乎所有的类都继承自根类NSObject,所以类中都有copy和mutableCopy两个方法,那么是否就意味着拥有这两个方法的对象可以直接调用这两个方法进行拷贝了呢?
我们先定义一个Mobile类继承自NSObject 进行测试,代码如下:
Mobile *mobile = [[Mobile alloc] init];
Mobile *mobile1 = [mobile copy];
运行程序发生崩溃,并输出以下错误信息:
Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[Mobile copyWithZone:]: unrecognized selector sent to instance 0x6000020da890’
意思是:Mobile类中找不到copyWithZone:方法。
由以上错误可知:拷贝操作表面是调用copy和mutableCopy方法,其实底层是调用对象自身的copyWithZone和mutableCopyWithZone方法来完成实际的复制工作。copy返回实际上就是copyWithZone:方法的返回值;mutableCopy与mutableCopyWithZone:方法也是同样的道理。
#import "Mobile.h"
@interface Mobile()<NSCopying>
@property(copy, nonatomic) NSString *name;
@end
@implementation Mobile
-(instancetype)copyWithZone:(NSZone *)zone {
Mobile *m = [[self class] allocWithZone:zone];
m.name = [self.name copy];
return m;
}
@end
运行代码
Mobile *mobile = [[Mobile alloc] init];
Mobile *mobile1 = [mobile copy];
NSLog(@"%p --%p",mobile,mobile1);
打印结果为:0x600001456610 --0x600001457a90
结果表明:p1和p2是两个地址不同的不同对象,复制操作成功。