copy和mutablecopy

本文探讨了NSCopying和NSMutableCopying协议的区别,通过实例演示了copy与mutablecopy在创建对象副本时的不同行为,并提供了一个自定义类实现这两种复制方式的例子。

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

copy和mutable copy都是我以前没有深究的东西,两个东西分别实现了nscopying和nsmutablecopying协议。
@protocol NSCopying

- (id)copyWithZone:(NSZone *)zone;

@end

@protocol NSMutableCopying

- (id)mutableCopyWithZone:(NSZone *)zone;

@end

协议非常简单,一般我们调用系统的nsarray,nsdictionary等等都已经实现了这两个协议。

<NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>

这4个协议,后面两个会在后面讲到。

copy是生成对象的副本,但是对象不可变的

mutablecopy生成对象的副本,但是是可变的

这就是区别

我们来看下下面这个例子:

NSMutableArray * arr = [[NSMutableArray alloc] initWithObjects:@"aaa",@"bbb",@"ccc", nil];
    
    NSMutableArray * arrA = [arr mutableCopy];
    
    NSMutableArray * arrB = [arr copy];
    
    
    [arr removeObject:@"aaa"];
    
    [arrA removeObject:@"bbb"];
    
    [arrB removeObject:@"ccc"];

但运行到arrb remove的时候直接crash掉了,就直接说明了这个问题。

但是由于是可变数组,你可能不太了解,我们自己实现一个类,来说明问题。


@interface Person : NSObject<NSCopying,NSMutableCopying>
{
    @public
    NSInteger  age;
}

//@property(nonatomic , assign)NSInteger  age;

@end

- (id)copyWithZone:(NSZone *)zone
{
    Person * person = [[Person alloc] init];
    person->age = self->age;
    return person;
}

- (id)mutableCopyWithZone:(NSZone *)zone
{
    Person * person = [[Person alloc] init];
    person->age = self->age;
    return person;
}

- (void)dealloc{
    [super dealloc];
}

这里copy有点问题,mutable copy很完美实现。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值