什么是深拷贝、浅拷贝?

通俗解释:深拷贝是内容拷贝,浅拷贝是地址拷贝

区别点:

深拷贝会创建一个新的内存空间,拷贝的值是一样的,但是内存地址不一样。

浅拷贝只是拷贝指向原来对象的地址,使原对象的引用计数+1

容器类对象与非容器类对象在深拷贝、浅拷贝方面的异同点?

什么是容器类对象?什么是非容器类对象?

像NSString、NSNumber这些不能包含其他对象的叫做非容器类对象

像NSArray、NSDictionary这些可以包含其他对象的叫容器类对象

不可变对象NSString

NSString *string1 = @"helloworld";

NSString *string2 = [string1 copy]; // 浅拷贝

NSString *string3 = [string1 mutableCopy]; // 深拷贝

NSMutableString *string4 = [string1 copy]; // 浅拷贝 此处需要注意copy返回的是不可变对象,string4不能被修改 否则会发生崩溃

NSMutableString *string5 = [string1 mutableCopy]; // 深拷贝

NSLog(@"string1 = %d;string2 = %d",string1,string2);

NSLog(@"string1 = %d;string3 = %d",string1,string3);

NSLog(@"string1 = %d;string4 = %d",string1,string4);

NSLog(@"string1 = %d;string5 = %d",string1,string5);

打印结果如下:

通过对比不难发现:

如果右侧是copy则是浅拷贝

如果右侧是mutableCopy则是深拷贝

可变对象NSMutableString

上面我们使用的是不可变的NSString,下面我们再使用可变的NSMutableString对比一下:

// 如果是一个MutableString,那么无论是copy,mutableCopy,都会创建一个新对象。

NSMutableString *string1 = [NSMutableString stringWithString:@"helloworld"];

NSString *string2 = [string1 copy]; // 深拷贝

NSString *string3 = [string1 mutableCopy]; // 深拷贝

NSMutableString *string4 = [string1 copy]; // 深拷贝 此处需要注意copy返回的是不可变对象,string4不能被修改 否则会发生崩溃

NSMutableString *string5 = [string1 mutableCopy]; // 深拷贝

NSLog(@"string1 = %d;string2 = %d",string1,string2);

NSLog(@"string1 = %d;string3 = %d",string1,string3);

NSLog(@"string1 = %d;string4 = %d",string1,string4);

NSLog(@"string1 = %d;string5 = %d",string1,string5);

打印结果如下:

不难发现,对于NSMutableString, 无论是copy还是mutableCopy都会创建一个新对象,属于深拷贝

不可变对象NSArray

NSArray *array01 = [NSArray arrayWithObjects:@"a",@"b",@"c", nil nil];

NSArray *copyArray01 = [array01 copy];

NSMutableArray *mutableCopyArray01 = [array01 mutableCopy];

NSLog(@"array01 = %d,copyArray01 = %d",array01,copyArray01);

NSLog(@"array01 = %d,mutableCopyArray01 = %d",array01,mutableCopyArray01);

NSLog(@"array01[0] = %d,array01[1] = %d,array01[2] = %d",array01[0],array01[1],array01[2]);

NSLog(@"copyArray01[0] = %d,copyArray01[1] = %d,copyArray01[2] = %d",copyArray01[0],copyArray01[1],copyArray01[2]);

NSLog(@"mutableCopyArray01[0] = %d,mutableCopyArray01[1] = %d,mutableCopyArray01[2] = %d",mutableCopyArray01[0],mutableCopyArray01[1],mutableCopyArray01[2]);

打印结果如下:

不难发现,copy是浅拷贝,mutableCopy是深拷贝,不过需要注意的是容器对象的成员元素都指向相同的地址

可变对象NSMutableArray

NSMutableArray *array01 = [NSMutableArray arrayWithObjects:@"a",@"b",@"c", nil nil];

NSArray *copyArray01 = [array01 copy];

NSMutableArray *mutableCopyArray01 = [array01 mutableCopy];

NSLog(@"array01 = %d,copyArray01 = %d",array01,copyArray01);

NSLog(@"array01 = %d,mutableCopyArray01 = %d",array01,mutableCopyArray01);

NSLog(@"array01[0] = %d,array01[1] = %d,array01[2] = %d",array01[0],array01[1],array01[2]);

NSLog(@"copyArray01[0] = %d,copyArray01[1] = %d,copyArray01[2] = %d",copyArray01[0],copyArray01[1],copyArray01[2]);

NSLog(@"mutableCopyArray01[0] = %d,mutableCopyArray01[1] = %d,mutableCopyArray01[2] = %d",mutableCopyArray01[0],mutableCopyArray01[1],mutableCopyArray01[2]);

打印结果如下:

对比可见,容器对象与非容器对象类似,可变对象的复制都是深拷贝,不可变对象copy是浅拷贝,mutableCopy是深拷贝

需要注意的是对容器而言,元素对象始终是指针复制

如何实现容器对象的完全深拷贝?

正如前面所说,容器对象中的元素对象无论是copy还是mutableCopy都是指针复制,如何实现容器对象的完全深拷贝呢?

系统API

系统为我们实现容器对象的完全深拷贝提供了方法

- (instancetype)initWithArray:(NSArray *)array copyItems:(BOOL)flag

// 使用方式如下:

- (void)fullCopy {

NSMutableArray *marray1 = [[NSMutableArray alloc] init];

NSMutableString *mstr1 = [[NSMutableString alloc]initWithString:@"value1"];

NSMutableString *mstr2 = [[NSMutableString alloc]initWithString:@"value2"];

[marry1 addObject:mstr1];

[marry1 addObject:mstr2];

NSArray *marray2 = [[NSArray alloc] initWithArray:marry1 copyItems:YES];

NSLog(@"marry1:%p - %@ \r\n",marry1,marry1);

NSLog(@"marry2:%p - %@ \r\n",marray2,marray2);

NSLog(@"数组元素地址:value1:%p - value2:%p \r\n",marry1[0],marry1[1]);

NSLog(@"数组元素地址:value1:%p - value2:%p \r\n",marray2[0],marray2[1]);

}

归档解档方法

- (void) deplyFullCopy

{

NSMutableArray *marry1 = [[NSMutableArray alloc] init];

NSMutableString *mstr1 = [[NSMutableString alloc]initWithString:@"value1"];

NSMutableString *mstr2 = [[NSMutableString alloc]initWithString:@"value2"];

[marry1 addObject:mstr1];

[marry1 addObject:mstr2];

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:marry1];

NSArray *marray2 = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:data error:nil];

NSLog(@"marry1:%p - %@ \r\n",marry1,marry1);

NSLog(@"marry2:%p - %@ \r\n",marray2,marray2);

NSLog(@"数组元素地址:value1:%p - value2:%p \r\n",marry1[0],marry1[1]);

NSLog(@"数组元素地址:value1:%p - value2:%p \r\n",marray2[0],marray2[1]);

}

自定义类如何实现深、浅拷贝

要想实现对象的自定义拷贝,必须实现NSCopying,NSMutableCopying协议,实现该协议的copyWithZone方法和mutableCopyWithZone方法

@interface Person()

@end

@implementation Person

// 对应copy方法

- (id)copyWithZone:(NSZone *)zone

{

Person *person = [[Person allocWithZone:zone] init];

person.name = self.name; // 这里的self就是被copy的对象

person.age = self.age;

return person;

}

- (id)mutableCopyWithZone:(NSZone *)zone

{

Person *person = [[Person allocWithZone:zone] init];

person.name = self.name;

person.age = self.age;

return person;

}

@end

使用场景

在声明字符串属性时尽量使用copy,如果使用strong声明属性,那么当源字符串发生改变时,对应的属性值也会发生改变,因为他们指向同一个地址,而使用copy就能杜绝这种情况,因为对于可变字符串进行copy是深拷贝,而strong只表示持有对象,引用计数加一。

python深拷贝和浅拷贝的使用场景_深拷贝、浅拷贝的理解与使用场景相关推荐

  1. python中队列的应用用场景_消息队列使用的四种场景介绍

    四.JMS消息服务 讲消息队列就不得不提JMS .JMS(JavaMessage Service,Java消息服务)API是一个消息服务的标准/规范,允许应用程序组件基于JavaEE平台创建.发送.接 ...

  2. hive使用适用场景_大数据入门:Hive应用场景

    在大数据的发展当中,大数据技术生态的组件,也在不断地拓展开来,而其中的Hive组件,作为Hadoop的数据仓库工具,可以实现对Hadoop集群当中的大规模数据进行相应的数据处理.今天我们的大数据入门分 ...

  3. Interview:算法岗位面试—10.11下午—上海某公司算法岗位(偏机器学习,互联网数字行业)技术面试考点之XGBoost的特点、python的可变不可变的数据类型、赋值浅拷贝深拷贝区别

    ML岗位面试:10.11下午-上海某公司算法岗位(偏机器学习,互联网数字行业)技术面试考点之XGBoost的特点.python的可变不可变的数据类型.赋值浅拷贝深拷贝区别 Interview:算法岗位 ...

  4. 浅拷贝copy(“=”)和深拷贝(“copy.deepcopy()”)

    python中对于对象的拷贝分为浅拷贝(copy)和深拷贝(deepcopy)两种方式. 其中浅拷贝由"="完成.而深拷贝由copy模块中deepcopy()函数担任. 浅拷贝和深 ...

  5. 创建二维数组 以及 python中[0 ]* n与[0 for _ in range(n)]的区别与联系

    一.浅拷贝于深拷贝 关于浅拷贝于深拷贝:Python 的深拷贝和浅拷贝 直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy) ...

  6. Cloud Computing:基于无影云电脑利用Python语言实现绘制“可爱小老虎”虎年快乐及无影云电脑简介、应用场景、使用体验(五步快速上手)分享图文教程之详细攻略

    Cloud Computing:基于无影云电脑利用Python语言实现绘制"可爱小老虎"虎年快乐及无影云电脑简介.应用场景.使用体验(五步快速上手)分享图文教程之详细攻略 目录 无 ...

  7. 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂

    Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...

  8. Python 程序设计(第二版)董付国_清华大学出版社_习题答案与分析【针对8.4及其之前的】

    更多精彩内容:(没有设置公众号获得,麻烦动动小手~谢谢) CSDN下载:Python编程无师自通电子书,[美]科里·奥尔索夫(Cory Althoff)-文档类-CSDN下载 百度云:链接:https ...

  9. python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客

    python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客 python脚本监控网站状态 2013-01-09 09:21:02 标签:监控 python 原创作品,允许转载,转载时请 ...

最新文章

  1. HTTP Status 400 -
  2. go context剖析之使用技巧
  3. makefile总结(转载学习)
  4. 低版本webview无法请求jquery ajax
  5. java 生产者消费者同步_经典线程同步问题(生产者消费者)--Java实现
  6. 盘点那些让人上火的提问方式(论如何让交流更高效)
  7. redis 使用案例
  8. 深度阅读----人工智能简史及其思维辩证
  9. c需要简单编程语言,教你C 语言简单编程速成
  10. Linux bpf 1.1、BPF内核实现
  11. 创新认知 基于LPC1114单片机的传感器使用
  12. 在拼多多上抢了点茅台
  13. 前端基础总结--CSS
  14. 微信灰度上线“群接龙”功能,据说只有1%的人能看到!
  15. 使用 Python 生成类数字字母混合验证码图片
  16. 数字签名与数字证书技术简介(一)
  17. 关于“四舍六入五成双/四舍六入五留双/四舍六入五单双”等口诀的实例研究
  18. 【原创】十六进制数值与字符串之间的转换(原封不动的转换)
  19. 华为手机鸿蒙系统手机_鸿蒙系统面世之后,以前的华为手机可以用鸿蒙系统吗?不好意思!...
  20. 软件测试周刊(第40期):大部分的恐惧与懒惰有关

热门文章

  1. 解决AJAX跨域WCF的问题详解
  2. 适用于 macOS 下 2K 显示器开启 HiDPI 的简便解决方案
  3. SQL2008 提示评估期已过的解决方法
  4. java自定义异常及异常的抛出
  5. Mac系统git clone 慢【解决方案】
  6. 如何强制“ git pull”覆盖本地文件?
  7. Java微信公众平台开发(四)--回复消息的分类及实体的创建
  8. 解密新一代Java JIT编译器Graal
  9. windows下mysql-8.0.11-winx64解压版配置
  10. https搭建(openssl)