定义
copy:不可变复制,返回的是一个不可变的对象;
mutableCopy:可变复制,返回的是一个可变对象;
例子
- NSString(地址:0x600003b6f840,class=NSString) --copy--> NSString(地址:0x600003b6f840,class=NSString) 地址值相等
- NSString(地址:0x600003b6f840,class=NSString) --mutableCopy--> NSMutableString(地址:0x600003b6f750,class=NSMutableString) 地址值不相等
- NSMutableString(地址:0x600003b7cc00,class=NSMutableString) --copy--> NSString(地址:0x600003b7eb20,class=NSString) 地址值不相等
- NSMutableString(地址:0x600003b7cc00,class=NSMutableString) --mutableCopy--> NSMutableString(地址:0x600003b7dd40,class=NSMutableString) 地址值不相等
解析
- 由于NSString本身就是不可变的,然而copy的新对象也是不可变的,直白点说就是两个对象都不能改变自己,所以系统就让他们指向同一块内存地址;
- 由于NSString本身就是不可变的,然而mutableCopy的新对象是可变的,所以就得新开辟一块新的地址;
- 由于NSMutableString本身是一个可变的,copy出来的对象是不可变的,所以也得开辟一块新的地址;
- 由于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:@""];**时,会报找不到方法的错误。