淺拷貝與深拷貝de區(qū)別
- 淺拷貝:淺拷貝只是增加了一個指針酵使,并指向一個已存在的內存,兩個指針指向同一個內存
- 深拷貝:深拷貝增加一個指針并且也申請一個新的內存焙糟,使這個增加的指針指向這個新的內存
實例
- 非容器類前后的變化(NSString口渔、NSNumber等)
//不可變對象 copy
NSString *str1 = @"123";
NSString *copyStr1 = [str1 copy];
NSLog(@"str1 = %p",str1);
NSLog(@"copyStr1 = %p",copyStr1);
//輸出內容(地址相同)
str1 = 0x100080068
copyStr1 = 0x100080068
//不可變對象 mutableCopy
NSString *str2 = [NSMutableString stringWithString:@"123"];
NSString *copyStr2 = [str2 mutableCopy];
NSLog(@"str2 = %p",str2);
NSLog(@"copyStr2 = %p",copyStr2);
//輸出結果 (地址不相同)
str2 = 0x146675670
copyStr2 = 0x146675c80
// 可變對象 copy
NSMutableString *str3 = [NSMutableString stringWithString:@"123"];
NSMutableString *mutableStr3 = [str3 copy];
NSLog(@"str3 = %p",str3);
NSLog(@"mutableStr3 = %p",mutableStr3);
//輸出結果(地址不相同)
str3 = 0x146676cc0
mutableStr3 = 0xa000000003332313
// 可變對象 mutableCopy
NSMutableString *str4 = [NSMutableString stringWithString:@"123"];
NSMutableString *mutableStr4 = [str3 mutableCopy];
NSLog(@"str4 = %p",str4);
NSLog(@"mutableStr4 = %p",mutableStr4);
//輸出結果(地址不相同)
str4 = 0x146618740
mutableStr4 = 0x1466755a0
- 容器類前后地址變化
// 不可變對象 copy
NSArray *array1 = @[@"111"];
NSArray *copyArray1 = [array1 copy];
NSLog(@"array1 = %p",array1);
NSLog(@"copyArray1 = %p",copyArray1);
NSLog(@"array1[0] = %@",array1[0]);
NSLog(@"copyArray1[0] = %@",copyArray1[0]);
//輸出結果(地址相同,內容相同)
array1 = 0x145e075d0
copyArray1 = 0x145e075d0
array1[0] = 111
copyArray1[0] = 111
// 不可變對象 mutableCopy
NSArray *array2 = @[@"111"];
NSArray *mutableArray2 = [array2 mutableCopy];
NSLog(@"array2 = %p",array2);
NSLog(@"mutableArray2 = %p",mutableArray2);
NSLog(@"array2[0] = %@",array2[0]);
NSLog(@"copyArray2[0] = %@",mutableArray2[0]);
//輸出結果(地址不相同穿撮, 內容相同)
array2 = 0x145e23010
mutableArray2 = 0x145e115f0
array2[0] = 111
mutableArray2[0] = 111
// 可變對象 copy
NSMutableArray *array3 = [NSMutableArray arrayWithArray:@[@"111"]];
NSMutableArray *copyArray3 = [array3 copy];
NSLog(@"array3 = %p",array3);
NSLog(@"copyArray3 = %p",copyArray3);
NSLog(@"array3[0] = %@",array3[0]);
NSLog(@"copyArray3[0] = %@",copyArray3[0]);
//輸出結果(地址不相同缺脉, 內容不相同)
array3 = 0x145e0c950
copyArray3 = 0x145e23030
array3[0] = 111
copyArray3[0] = 111
// 可變對象 mutableCopy
NSMutableArray *array4 = [NSMutableArray arrayWithArray:@[@"111"]];
NSMutableArray *mutableArray4 = [array4 mutableCopy];
NSLog(@"array4 = %p",array4);
NSLog(@"mutableArray4 = %p",mutableArray4);
NSLog(@"array4[0] = %@",array4[0]);
NSLog(@"mutableArray4[0]= %@",mutableArray4[0]);
//輸出結果(地址不相同, 內容相同)
array4 = 0x145e02010
mutableArray4 = 0x145e22670
array4[0] = 111
mutableArray4[0]= 111
總結:
- 無論是非容器類對象或容器類對象都符合以下規(guī)則:
- 對于不可變對象悦穿,copy是淺拷貝攻礼,mutableCopy是深拷貝
- 對于可變對象,copy和mutableCopy都是深拷貝
- 不論是可變還是不可變對像栗柒,copy返回的對象都是不可變的
- 對于容器類對象
不論是可變的還是不可變的礁扮,copy和mutableCopy返回的容器對象里所包含的對象的地址和之前的都是一樣的,即容器內對象都是淺拷貝
參考資料:耳東米青
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者