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