深拷貝和淺拷貝是一個經常問到的問題。     很多人認為copy是淺拷貝,mutableCopy是深拷貝。在解釋copy與mutableCopy的區別,我們先搞清楚什么是深拷貝和淺拷貝     
從圖我們看出來淺拷貝只是拷貝了指針,而并未拷貝對象本身。而深拷貝則是指針和對象本身都進行了拷貝
代碼演示 使用不可變集合對象
NSArray *array = @[@"4444"]; NSArray *array2 = array; NSLog(@"array === %p %p", &array, array); NSLog(@"array2 === %p %p", &array2, array2);打印結果
array === 0x7fff5fbff738 0x100403120array2 === 0x7fff5fbff730 0x100403120array與array2指針地址不同
mutableCopy
NSArray *array = @[@"4444"]; NSArray *array2 = [array mutableCopy]; NSLog(@"array === %p %p", &array, array); NSLog(@"array2 === %p %p", &array2, array2);打印結果
array === 0x7fff5fbff738 0x100203520array2 === 0x7fff5fbff730 0x1002024e0我們發現兩者的指針指著不一樣,內容也不一樣,也就是說,實現了內容和指針的拷貝。也就是深拷貝
那是用copy時候的打印結果是什么? 打印結果
array === 0x7fff5fbff738 0x100202b90array2 === 0x7fff5fbff730 0x100202b90結果是內容沒有拷貝,而指針進行了拷貝。故copy為淺拷貝
結論 使用不可變對象時,無論是copy還是mutableCopy。結果都是淺拷貝
打印結果
mutable ===== 0x7fff5fbff758 0x100203cb0array1 ===== 0x7fff5fbff750 0x100203170指針進行了拷貝,內容也進行了拷貝。所以是深拷貝。
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"1111",@"22222", nil]; NSMutableArray *array = [mutableArray mutableCopy]; NSLog(@"mutable ===== %p %p", &mutableArray, mutableArray); NSLog(@"array1 ===== %p %p", &array, array);打印結果
mutable ===== 0x7fff5fbff758 0x100401270array1 ===== 0x7fff5fbff750 0x100403230其指針和內容都已經進行了改變。所以這個時候mutableCopy便是深拷貝了。
對于使用可變對象時,copy和mutableCopy都是深拷貝。
那深拷貝和淺拷貝在使用上的區別呢?
NSArray *mutableArray = @[@"111"]; NSMutableArray *array = [mutableArray copy]; [array addObject:@"333"]; NSLog(@"%@", array);打印結果 -[__NSSingleObjectArrayI addObject:] 說明array是不可變數組,那如何改變array呢?
NSArray *mutableArray = @[@"111"]; NSMutableArray *array = [mutableArray mutableCopy]; [array addObject:@"333"]; NSLog(@"%@", array);我們發現此時array是可以更改的對象
對于不可變對象而言,copy便是淺拷貝,而mutableCopy是深拷貝。 對于可變對象而言,copy和mutableCopy都是深拷貝。但是copy出來的對象是不可變的,而mutableCopy則是可變對象。
新聞熱點
疑難解答