国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 遵义市| 宣城市| 永泰县| 林周县| 衡南县| 黑龙江省| 德清县| 景德镇市| 滨海县| 墨竹工卡县| 云霄县| 益阳市| 安国市| 陈巴尔虎旗| 东至县| 新民市| 阿克陶县| 盐边县| 平度市| 凌云县| 扶风县| 沙坪坝区| 昌图县| 鄂托克前旗| 八宿县| 县级市| 弥勒县| 全州县| 老河口市| 赤壁市| 治多县| 洛川县| 莱州市| 大兴区| 凤台县| 沾益县| 汝阳县| 安丘市| 衡水市| 北辰区| 岳阳县|