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!
努力是為了當機會來臨時不會錯失機會。
共勉!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容