博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 深复制与浅复制
阅读量:4141 次
发布时间:2019-05-25

本文共 3234 字,大约阅读时间需要 10 分钟。

文章目录

简介

  • 浅复制:只改变新对象的指针指向,并未生成新的内存地址,只是将新对象的指针指向要复制对象的内存地址
  • 深复制:改变新对象指针指向,还为对象生成新的内存地址。 深复制又分为单层深复制与完全深复制
    1.单层深复制虽然生成了新的内存地址,但是新的对象中的元素地址还是旧对象元素的地址
    2.完全深复制不仅内存地址是新的,对象里面的元素地址也是新的

代码探索

非集合类对象

copy操作:

NSString *str = @"123";    NSString *copyStr = [str copy];    NSLog(@"%p ---- %p", str, copyStr);        NSMutableString *mutableStr = [NSMutableString stringWithString:@"123"];    NSString *copyMutableStr = [mutableStr copy];    NSLog(@"%p  ----  %p", mutableStr, copyMutableStr);

打印结果:

2019-10-27 00:45:57.085342+0800 iii[17764:606331] 0x1043560a8 ---- 0x1043560a82019-10-27 00:45:57.085455+0800 iii[17764:606331] 0x6000037de4c0  ----  0xb44a90872ddcc8d4

可知:

  • NSString类型的string进行copy操作生成的新对象只是指向了旧对象的内存地址,并未产生新的内存地址,即进行了浅复制
  • NSMutableString类型的string进行copy操作产生了新的内存地址,生成NSString类型的对象,即进行了深复制

mutableCopy操作:

NSString *str = @"123";    NSString *copyStr = [str mutableCopy];    NSLog(@"%p ---- %p", str, copyStr);        NSMutableString *mutableStr = [NSMutableString stringWithString:@"123"];    NSString *copyMutableStr = [mutableStr mutableCopy];    NSLog(@"%p  ----  %p", mutableStr, copyMutableStr);

打印结果:

2019-10-27 00:53:35.014694+0800 iii[17841:609737] 0x105a190a8 ---- 0x600003d97ab02019-10-27 00:53:35.014830+0800 iii[17841:609737] 0x600003d97ae0  ----  0x600003d97b10

可知:

无论是NSString还是NSMutableString类型,进行mutableCopy操作都是深复制

集合类对象

copy操作:

NSArray *array = @[@"aaa", @"bbb"];    NSArray *copyArray = [array copy];    NSLog(@"%p   ----    %p", array, copyArray);        NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"aaa", @"bbb", nil];    NSArray *copyMutableArray = [mutableArray copy];    NSLog(@"%p   ----    %p", mutableArray, copyMutableArray);

打印结果:

2019-10-27 00:59:58.672244+0800 iii[17941:612750] 0x6000011f4960   ----    0x6000011f49602019-10-27 00:59:58.672385+0800 iii[17941:612750] 0x600001f9bc90   ----    0x6000011910c0

可知:

与非集合类对象结果相同:

  • NSArray类型的string进行copy操作生成的新对象只是指向了旧对象的内存地址,并未产生新的内存地址,即进行了浅复制
  • NSMutableArray类型的string进行copy操作产生了新的内存地址,生成NSString类型的对象,即进行了深复制

mutableCopy操作 :

NSArray *array = @[@"aaa", @"bbb"];    NSArray *copyArray = [array mutableCopy];    NSLog(@"%p   ----    %p", array, copyArray);        NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"aaa", @"bbb", nil];    NSArray *copyMutableArray = [mutableArray mutableCopy];    NSLog(@"%p   ----    %p", mutableArray, copyMutableArray);

打印结果:

2019-10-27 01:02:48.055444+0800 iii[17970:614232] 0x600000bbcda0   ----    0x6000005c88402019-10-27 01:02:48.055563+0800 iii[17970:614232] 0x6000005c8450   ----    0x6000005c8c00

与非集合类对象结果相同:

无论是NSArray还是NSMutableArray类型,进行mutableCopy操作都是深复制

单层深复制

打印数组中元素地址:

NSArray *array = @[@"111", @"222"];    NSArray *copyArray = [array mutableCopy];    NSLog(@"%p   ----    %p", array[0], copyArray[0]);        NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"aaa", @"bbb", nil];    NSArray *copyMutableArray = [mutableArray mutableCopy];    NSLog(@"%p   ----    %p", mutableArray[0], copyMutableArray[0]);

打印结果:

2019-10-27 01:08:17.634645+0800 iii[18027:616895] 0x103ddc0b8   ----    0x103ddc0b82019-10-27 01:08:17.634780+0800 iii[18027:616895] 0x103ddc118   ----    0x103ddc118

可知

元素的地址并没有发生变化,即为单层深复制

完全深复制

要实现元素地址的改变,即完全深复制,可使用协议或归档解档实现,写这篇文章时还没有了解到,现在补上博客:

转载地址:http://kzkti.baihongyu.com/

你可能感兴趣的文章
从一列数中筛除尽可能少的数,使得从左往右看这些数是从小到大再从大到小...
查看>>
判断一个整数是否是回文数
查看>>
经典shell面试题整理
查看>>
腾讯的一道面试题—不用除法求数字乘积
查看>>
素数算法
查看>>
java多线程环境单例模式实现详解
查看>>
将一个数插入到有序的数列中,插入后的数列仍然有序
查看>>
在有序的数列中查找某数,若该数在此数列中,则输出它所在的位置,否则输出no found
查看>>
万年历
查看>>
作为码农你希望面试官当场指出你错误么?有面试官这样遭到投诉!
查看>>
好多程序员都认为写ppt是很虚的技能,可事实真的是这样么?
查看>>
如果按照代码行数发薪水会怎样?码农:我能刷到公司破产!
查看>>
程序员失误造成服务停用3小时,只得到半月辞退补偿,发帖喊冤
查看>>
码农:很多人称我“技术”,感觉这是不尊重!纠正无果后果断辞职
查看>>
php程序员看过来,这老外是在吐糟你吗?看看你中了几点!
查看>>
为什么说程序员是“培训班出来的”就是鄙视呢?
查看>>
码农吐糟同事:写代码低调点不行么?空格回车键与你有仇吗?
查看>>
阿里p8程序员四年提交6000次代码的确有功,但一次错误让人唏嘘!
查看>>
一道技术问题引起的遐想,最后得出结论技术的本质是多么的朴实!
查看>>
985硕士:非科班自学编程感觉还不如培训班出来的,硕士白读了?
查看>>