copyWithZone

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是两个地址不同的不同对象,复制操作成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值