copy mutableCopy的区别

1,310 阅读2分钟

定义

copy:不可变复制,返回的是一个不可变的对象;
mutableCopy:可变复制,返回的是一个可变对象;

例子

  1. NSString(地址:0x600003b6f840,class=NSString) --copy--> NSString(地址:0x600003b6f840,class=NSString) 地址值相等
  2. NSString(地址:0x600003b6f840,class=NSString) --mutableCopy--> NSMutableString(地址:0x600003b6f750,class=NSMutableString) 地址值不相等
  3. NSMutableString(地址:0x600003b7cc00,class=NSMutableString) --copy--> NSString(地址:0x600003b7eb20,class=NSString) 地址值不相等
  4. NSMutableString(地址:0x600003b7cc00,class=NSMutableString) --mutableCopy--> NSMutableString(地址:0x600003b7dd40,class=NSMutableString) 地址值不相等

解析

  1. 由于NSString本身就是不可变的,然而copy的新对象也是不可变的,直白点说就是两个对象都不能改变自己,所以系统就让他们指向同一块内存地址;
  2. 由于NSString本身就是不可变的,然而mutableCopy的新对象是可变的,所以就得新开辟一块新的地址;
  3. 由于NSMutableString本身是一个可变的,copy出来的对象是不可变的,所以也得开辟一块新的地址;
  4. 由于NSMutableString本身是一个可变的,mutableCopy出来的对象也是可变的,为了保证其中一个对象的值被修改 影响到另外一个对象,所以也得开辟一块新的地址值。

属性定义

// 定义一个可变数组
@property (nonatomic, copy) NSMutableArray *arr;

// MRC环境下重新set方法
- (void)setArr:(NSMutableArray *)arr {
    if (_arr != arr) {
        [_arr release];
        [arr copy]; // arr经过copy操作后,数据类型变为NSArray
    }
}

定义个copy修饰的可变数组NSMutableArray,其实在ARC内部在重写set方法时,arr经过copy操作后,数据类型变为NSArray,所以在外部调用**[arr addObject:@""];**时,会报找不到方法的错误。