美文网首页
iOS copy和mutableCopy

iOS copy和mutableCopy

作者: 山杨 | 来源:发表于2021-09-29 15:50 被阅读0次

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

由于值不变所以:

  • 只讨论是否需要为这个新对象分配内存。
  • 从被拷贝的对象是可变还是不可变开始讨论:
  • 该对象是否支持copymutableCopy
不可变对象:

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
  • 使用copy修饰的属性实际上自动生成了这样的代码,由于NSArray本来就是不可变对象,copy之后的副本指向和原对象相同,所以没什么影响;但是NSMutableArray使用copy之后,生成的副本是一个不可变对象(即NSArray),且重新分配了一块内存给副本。此时如果外部调用
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:中国

相关文章

  • iOS开发之copy

    iOS中copy有两种copy和mutableCopy

  • copy与mutablecopy使用对比

    杂七杂八 copy和mutableCopy都是浅拷贝!!!iOS中的copy,mutableCopy,深拷贝和浅拷...

  • iOS 内存(系统引用的技术)了解

    iOS程序的内存布局 Tagged Pointer OC对象的内存管理 copy和mutableCopy

  • 【iOS】copy和mutableCopy

    NSString NSString copy 没有生成新的字符串 NSString mutableCopy 生成了...

  • iOS copy和mutableCopy

    一、copy (1)用copy修饰的 或者赋值的 变量肯定是不可变的。 (2)用copy赋值,要看源对象是否是可变...

  • iOS copy和mutableCopy

    经测试得出如下结论:【测试代码和测试结果见后面】 不管是非集合类对象,还是集合类对象,执行copy之后的对象,不管...

  • iOS copy和mutableCopy

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

  • iOS copy 和 mutableCopy

    copy 和mutableCopy 这种老生常谈的问题,还是得掰扯掰扯 之前在我们的意识当中 copy 和muta...

  • iOS开发深拷贝与浅拷贝的关系

    IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解 copy与retain的区别: copy是创建...

  • copy和mutableCopy

    copy和mutableCopy copy只会产生不可变的副本对象(比如NSString) mutableCopy...

网友评论

      本文标题:iOS copy和mutableCopy

      本文链接:https://www.haomeiwen.com/subject/gqsjnltx.html