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

首頁 > 學院 > 開發設計 > 正文

OC當中的深拷貝和淺拷貝

2019-11-09 17:16:22
字體:
來源:轉載
供稿:網友

深拷貝和淺拷貝是一個經常問到的問題。 很多人認為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 0x100403120

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

使用可變對象

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

打印結果

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則是可變對象。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永仁县| 棋牌| 永丰县| 肇源县| 惠来县| 丰台区| 邛崃市| 比如县| 泗阳县| 长宁区| 赞皇县| 缙云县| 镇宁| 微山县| 宜兰县| 芜湖县| 旬阳县| 浏阳市| 延庆县| 宜丰县| 阿拉善右旗| 定襄县| 乡城县| 卓尼县| 吉木萨尔县| 施甸县| 万安县| 板桥市| 资兴市| 安化县| 卓资县| 易门县| 浙江省| 双牌县| 凉城县| 迁西县| 磐石市| 察雅县| 耒阳市| 洪江市| 方山县|