国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

OC當(dāng)中的深拷貝和淺拷貝

2019-11-09 16:07:28
字體:
供稿:網(wǎng)友

深拷貝和淺拷貝是一個經(jīng)常問到的問題。 很多人認(rèn)為copy是淺拷貝,mutableCopy是深拷貝。在解釋copy與mutableCopy的區(qū)別,我們先搞清楚什么是深拷貝和淺拷貝 區(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 0x100403120

array與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é)果都是淺拷貝

使用可變對象

NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"111", @"222", nil]; NSMutableArray *array1 = [mutableArray copy]; NSLog(@"mutable ===== %p %p", &mutableArray, mutableArray); NSLog(@"array1 ===== %p %p", &array1, array1);

打印結(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便是深拷貝了。

結(jié)論

對于使用可變對象時,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是可以更改的對象

最終結(jié)論

對于不可變對象而言,copy便是淺拷貝,而mutableCopy是深拷貝。 對于可變對象而言,copy和mutableCopy都是深拷貝。但是copy出來的對象是不可變的,而mutableCopy則是可變對象。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 靖西县| 连州市| 松桃| 余庆县| 丽水市| 瑞丽市| 广东省| 钟山县| 花垣县| 虎林市| 龙里县| 平昌县| 澄城县| 建宁县| 莱阳市| 东阿县| 南郑县| 洪江市| 苍南县| 奎屯市| 明溪县| 新化县| 宁强县| 德令哈市| 寿光市| 蓬溪县| 建阳市| 枣阳市| 梁山县| 湘乡市| 恩平市| 泽普县| 临夏县| 钟山县| 宝清县| 珠海市| 安仁县| 城固县| 疏附县| 遂昌县| 杨浦区|