OC_自定义对象的Copy方法

本文解释了在Objective-C中自定义类实现深拷贝的过程。通过遵循NSCopying协议及实现copyWithZone方法,确保对象属性能正确复制,避免了浅拷贝带来的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值