iOS copy和mutableCopy

2021-09-29  本文已影响0人  山杨

心得:
不管是copy还是mutableCopy,目的都是拷贝出来一个新的对象,并且值都不变。

由于值不变所以:

不可变对象:

copy出来的是不可变对象(由于都是不可变的,所以不需要再次分配内存)浅拷贝
mutableCopy出来的是可变对象(需要为新对象再次分配内存)深拷贝

可变对象:

copy出来的也是不可变对象(需要分配内存,因为在修改可变对象的时候要保证copy出来的对象不受影响)深拷贝
mutableCopy出来的是可变对象(需要分配内存,因为两个对象之间修改需要互不干扰)深拷贝

实际使用中的第一种情况:

@interface YSPerson : NSObject

@property (nonatomic, copy) NSArray *arr;

@property (nonatomic, copy) NSMutableArray *arrM;

@end

@implementation YSPerson

- (void)setArr:(NSArray *)arr {
    
    if (_arr != arr) {
        
        _arr = [arr copy];
    }
}

- (void)setArrM:(NSMutableArray *)arrM {
    
    if (_arrM != arrM) {
        
        _arrM = [arrM copy];
    }
}

@end
YSPerson *person = [YSPerson new];
person.arrM = [NSMutableArray array];
[person.arrM addObject:@"x1"];

程序就会崩溃,因为person.arrM实际变成了NSArray对象,NSArray是没有addObject:方法的。

实际使用中的第二种情况:

有时候会有copy自定义类对象的需求,但如果直接使用copy会报找不到copyWithZone:方法,解决办法:实现<NSCopying>协议下的copyWithZone:方法,如下:

@interface YSPerson : NSObject<NSCopying>

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *address;

@end

@implementation YSPerson

- (id)copyWithZone:(NSZone *)zone {
    
    YSPerson *p = [[YSPerson allocWithZone:zone] init];// zone为内存区域
    // 选择需要copy的属性
    p.name = self.name;
    p.address = self.address;
    return p;
}
@end

这样就可以在外部直接对YSPerson对象进行copy操作了

YSPerson *p1 = [YSPerson new];
p1.name = @"xx";
p1.address = @"中国";

YSPerson *p2 = [p1 copy];
NSLog(@"name:%@, address:%@", p2.name, p2.address);
// 打印结果:name:xx, address:中国
上一篇 下一篇

猜你喜欢

热点阅读