copy方法和mutableCopy方法的区别

copy方法指针拷贝,浅拷贝;
mutableCopy方法地址拷贝,深拷贝。

简单操作

NSString *str1 = @"123";
NSString *str2 = [str1 copy];
NSLog(@"str1 = %@  str1P = %p \n str2 = %@ str2P = %p",str1,str1,str2,str2);
图片 1.png
NSMutableString *mStr1 = [[NSMutableString alloc] initWithString:@"123"];
NSMutableString *mStr2 = [mStr1 mutableCopy];
NSLog(@"\n mStr1=%@ , mStr2=%@ \n mStr1p = %p, mStr2p = %p", mStr1,mStr2,mStr1,mStr2);
图片 2.png

特性:互不影响原则

NSString *str1 = @"123";
NSString *str2 = [str1 copy];
str1 = @"abcd";
NSLog(@"\n str1=%@ , str2=%@ \n str1p = %p, str2p = %p", str1,str2,str1,str2);
图片 3.png

可以看到,当str1值变了之后,str2的值不跟着变,虽然是copy方法浅拷贝,并且指向新的内存地址。互不影响原则。

可变对象的copy和mutableCopy

NSMutableArray *mArr1 = [@[@"123",@"456",@"789"] mutableCopy];
NSMutableArray *mArr2 = [mArr1 copy];
NSLog(@"\n mArr1=%@ , mArr2=%@ \n mArr1p = %p, mArr2p = %p \n mArr1Class=%@, mArr2Class=%@", mArr1,mArr2,mArr1,mArr2,[mArr1 class],[mArr2 class]);
图片 4.png

可以看到,以为copy方法的源对象即mArr1是可变对象,所以是地址拷贝;且因为是copy方法,所以mArr2实际上是不可变对象。

@property (nonatomic, copy) NSMutableArray *mArr3;//strong 修饰符

NSArray *arr1 = @[@"333",@"222",@"111"];
self.mArr3 = [arr1 mutableCopy];//copy方法输出看
NSLog(@"\n arr1=%@ , mArr3=%@ \n arr1p = %p, mArr3p = %p \n arr1Class=%@, mArr3Class=%@", arr1,_mArr3,arr1,_mArr3,[arr1 class],[_mArr3 class]);
图片 5.png

因为mArr3的修饰符是copy,所以mArr3肯定是不可变对象,因为是mutableCopy方法,所以是地址拷贝。

如果mArr3的修饰符是strong,其他不变,那么地址拷贝,可变对象。

如果mArr3的修饰符是strong,且为copy方法,那么因为源对象是不可变,所以是指针拷贝,且是可变对象。

总结

用copy修饰的或者赋值的变量肯定是不可变的;
用copy赋值,要看源对象是否可变,来决定只拷贝指针,还是也拷贝对象到另一块内存空间;
对象之间mutableCopy赋值,肯定会拷贝整个对象内存到另一个内存中;
对象之间赋值之后,再改变,遵循互不影响的原则。


觉得有用,请帮忙点亮红心


Better Late Than Never!
努力是为了当机会来临时不会错失机会。
共勉!

你可能感兴趣的:(copy方法和mutableCopy方法的区别)