copy与mutableCopy区别,strong和copy的使用

本篇文章主要讲两个知识点:1.深拷贝与浅拷贝 2.NSArray和NSMutaleArray应该用copy还是stong修饰。

一、我们先来分析深拷贝(返回一个对象,一个新的指针指向一个新的内容)与浅拷贝(返回一个对象,一个新的指针指向旧的内容)。

这里面分集合类型(NSArray、NSDictionary、NSSet等类型)与非集合类型(NSString等类型)。

1.分析NSString不可变类型:

  NSLog(@"非集合不可变类型进行Copy与MutableCopy");
   NSString * orginStr = @"原始数据";
   NSString * copyStr = [orginStr copy];
   NSMutableString * mutableStr = [orginStr mutableCopy];
   NSLog(@"内存地址-->orginStr:%p  copyStr:%p  mutableStr:%p",orginStr,copyStr,mutableStr);
   NSLog(@"内容orginStr:%@  copyStr:%@  mutableStr:%@",orginStr,copyStr,mutableStr);

然后看下打印结果:

屏幕快照 2017-09-01 下午11.28.34.png

对NSString类型进行copy,内存地址没有变化,没产生新对象;mutable时内存地址变了,产生了新对象。
2.分析NSArray不可变类型:

   NSLog(@"集合不可变类型进行Copy与MutableCopy");
    NSArray * orginArray = [NSArray arrayWithObjects:@"小红",@"小明",@"小李",nil];
    NSArray * copyArray = [orginArray copy];
    NSMutableArray * mutableCopyArray = [orginArray mutableCopy];
    NSLog(@"内存地址-->orginArray:%p  copyArray:%p  mutableCopyArray:%p",orginArray,copyArray,mutableCopyArray);

看下打印结果:

对NSArray类型进行copy,内存地址没有变化,没产生新对象;mutable时内存地址变了,产生了新对象。

3.分析NSMutableString可变类型

 NSLog(@"非集合可变类型进行Copy与MutableCopy");
    NSMutableString * orginStr = [[NSMutableString alloc]initWithString:@"原始数据"];
    NSString * copyStr = [orginStr copy];
    NSMutableString * mutableStr = [orginStr mutableCopy];
    NSLog(@"内存地址-->orginStr:%p  copyStr:%p  mutableStr:%p",orginStr,copyStr,mutableStr);
    NSLog(@"内容orginStr:%@  copyStr:%@  mutableStr:%@",orginStr,copyStr,mutableStr);

看下打印结果:

对NSMutableString类型进行copy,内存地址没有变化,没产生新对象;mutable时内存地址变了,产生了新对象。

4.分析NSMutableArray可变类型

  NSLog(@"集合可变类型进行Copy与MutableCopy");
    NSArray * orginArray = [NSMutableArray arrayWithObjects:@"小红",@"小明",@"小李", nil];

    NSArray * copyArray = [orginArray copy];
    NSMutableArray * mutableCopyArray = [orginArray mutableCopy];
    NSLog(@"内存地址-->orginArray:%p  copyArray:%p  mutableCopyArray:%p",orginArray,copyArray,mutableCopyArray);

看下打印结果

以上四种情况,我们可以得到这样结论:
A.不可变类型(不管是集合还是非集合),copy结果,不产生新对象,浅拷贝;
不可变类型(不管是集合还是非集合),mutableCopy结果,产生新对象,深拷贝.

B.可变类型(不管是集合还是非集合),copy结果,产生新对象,深拷贝;
可变类型(不管是集合还是非集合),mutableCopy结果,产生新对象,深拷贝.

二、说完拷贝与深拷贝我们来研究下copy与strong对不可变类型(NString、NSArray、NSSet),以及对可变类型(NSMutableString、NSMutableArray、NSMutableSet)的影响。
这是声明的一些属性:

1.copy与strong对不可变类型(NString、NSArray、NSSet)影响:

先看对不可变类型(NString、NSArray、NSSet)的影响:

 NSLog(@"NSArray的修饰词测试");
    NSMutableArray * orginMutableArray = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];
    self.copydArray = orginMutableArray;
    self.strongArray = orginMutableArray;
    NSLog(@"内存地址-->orginMutableArray:%p  self.copydArray:%p  self.strongMutableArray:%p",orginMutableArray,self.copydArray,self.strongArray );
     NSLog(@"内容-->orginMutableArray:%@  self.copydArray:%@  self.strongMutableArray:%@",orginMutableArray,self.copydArray,self.strongArray );

    [orginMutableArray removeLastObject];
    NSLog(@"删除一个元素后内容-->orginMutableArray:%@  self.copydArray:%@  self.strongMutableArray:%@",orginMutableArray,self.copydArray,self.strongArray );

再看下打印结果

copy与mutableCopy区别,strong和copy的使用

当原始数组删除一个元素后,用strong修饰的array也删除一个,而copy修饰的却不变。NSarray本来就应该是不变的,所以对不可变类型(NString、NSArray、NSSet),要用copy修饰。
2.copy与strong对对可变类型(NSMutableString、NSMutableArray、NSMutableSet)的影响:

NSLog(@"NSMutableArray的修饰词测试");
    NSMutableArray * orginMutableArray = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];
    self.copydMutableArray = orginMutableArray;
    self.strongMutableArray = orginMutableArray;
    NSLog(@"内存地址-->orginMutableArray:%p  self.copydMutableArray:%p  self.strongMutableArray:%p",orginMutableArray,self.copydMutableArray,self.strongMutableArray);

    [self.strongMutableArray removeLastObject];

这里当我们用copy修饰可变类型(NSMutableString、NSMutableArray、NSMutableSet)时,竟然崩溃了。因为当用copy修饰后,NSMutaleArray由可变类型变成了不可变类型,而NSArray并没有增、删元素的方法,所以崩溃。因此,可变类型(NSMutableString、NSMutableArray、NSMutableSet),要用strong修饰。

所以我们得出结论:
A.对不可变类型(NString、NSArray、NSSet),要用copy修饰;
B.可变类型(NSMutableString、NSMutableArray、NSMutableSet),要用strong修饰;
C.用copy还是strong修饰一个属性时,与深拷贝浅拷贝不要混为一谈了,是两码事。

最后,写下本文所得到的五个结论:
1.不可变类型(不管是集合还是非集合),copy结果,不产生新对象,浅拷贝;
不可变类型(不管是集合还是非集合),mutableCopy结果,产生新对象,深拷贝.

2.可变类型(不管是集合还是非集合),copy结果,产生新对象,深拷贝;
可变类型(不管是集合还是非集合),mutableCopy结果,产生新对象,深拷贝.

3.对不可变类型(NString、NSArray、NSSet),要用copy修饰;
4.可变类型(NSMutableString、NSMutableArray、NSMutableSet),要用strong修饰;
5.用copy还是strong修饰一个属性时,与深拷贝浅拷贝不要混为一谈了,是两码事。

本文有用到https://www.zybuluo.com/MicroCai/note/50592,以及http://blog.csdn.net/winzlee/article/details/51752354两篇博客的知识点。

本文Demo地址:https://github.com/zhangxistudy11/KnowledgeSummaryOfObjectC
文章有不合理之处,以及代码不合理的地方,请各位读者及时指出。如果给你带来新的认知和便利,欢迎点赞!

Original: https://www.cnblogs.com/Free-Thinker/p/16085558.html
Author: brave-sailor
Title: copy与mutableCopy区别,strong和copy的使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/545774/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot 如何进行参数校验

    为什么需要参数校验 在日常的接口开发中,为了防止非法参数对业务造成影响,经常需要对接口的参数进行校验,例如登录的时候需要校验用户名和密码是否为空,添加用户的时候校验用户邮箱地址、手…

    技术杂谈 2023年6月21日
    094
  • Codeforces 346C Number Transformation II 构造

    题目链接:点击打开链接 = = 990+ms卡过 #include #include #include #include #include #include using names…

    技术杂谈 2023年5月30日
    088
  • 聊聊消息队列高性能的秘密——零拷贝技术

    前言 RocketMQ为什么这么快、Kafka为什么这么快?用了零拷贝技术?什么是零拷贝技术,它们二者的零拷贝技术有不同吗? 为什么需要零拷贝 在计算机产业中,I/O的速度相较CP…

    技术杂谈 2023年7月25日
    069
  • Tomcat性能优化方案

    你使用过tomcat的话,简单的说就是”内存溢出”. 通常情况下,这种问题出现在实际的生产环境中.产生这种问题的原因是tomcat使用较少的内存给进程,通过…

    技术杂谈 2023年7月11日
    052
  • select count(*)和select count(1)

    一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的 假如表沒有主键(Primary key), 那么count(1)比count(*)…

    技术杂谈 2023年5月31日
    0103
  • []总结常见获客渠道

    [原创]总结常见获客渠道 [原创]总结常见获客渠道 1 搜索 百度 搜狗 360 2 媒体 图文 微信公众号 头条 微博 视频 短视频 抖音 快手 长视频 爱奇艺 腾讯视频 直播 …

    技术杂谈 2023年5月30日
    0120
  • 学习用具汇总

    透明硅胶软垫 写字舒服,不用担心桌子太硬写字难受!省力。外出考试带着,不用担心桌子太破把试卷戳破。搜索的时候就搜:考试专用透明垫板。 活页笔记本 可撕黑色横线信纸 每张都能撕下来,…

    技术杂谈 2023年6月1日
    082
  • MySQL备份与恢复

    MySQL备份与恢复 备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低。 数据丢失的场景举例: 人…

    技术杂谈 2023年6月21日
    081
  • ThreadLocalRandom类原理分析

    public int nextInt(int bound) { if (bound > 31); else { for (int u = r; u – (r = u % bo…

    技术杂谈 2023年7月11日
    068
  • 批量执行失败的Power Automate 流程

    概述 Power Automate 是一个云端的服务,它可以让我们很方便地定义流程,这些流程可以根据事件触发、手工运行、被程序调用、定时运行等,设计这种流程不需要编程能力,它内置了…

    技术杂谈 2023年5月31日
    085
  • OS第四章错题

    OS第四章错题 ​ 在页式存储管理中,采用动态重定向方式,所以在地址变换机构中需要硬件;而段式存储管理中,地址变换机构中有段表寄存器,所以也会有硬件 ​ UNIX概念题 ​ 静态重…

    技术杂谈 2023年7月11日
    071
  • 文件系统预读【转】

    转自:https://www.cnblogs.com/linhaostudy/p/16126723.html 正文 所谓预读,是指文件系统为应用程序一次读出比预期更多的文件内容并缓…

    技术杂谈 2023年5月31日
    087
  • dremio 当前支持的权限

    了解dremio 当前支持的权限,可以让给你我们更好的处理以及学习dremio的安全控制机制 数据集权限 alter 对于system,space,source,folder,pd…

    技术杂谈 2023年5月30日
    0128
  • Hexo博客系列(三)-将Hexo v3.x个人博客发布到GitLab Pages

    【原文链接】:https://blog.tecchen.xyz ,博文同步发布到博客园。由于精力有限,对文章的更新可能不能及时同步,请点击上面的原文链接访问最新内容。欢迎访问我的个…

    技术杂谈 2023年7月11日
    080
  • 20天等待,申请终于通过,安装和体验IntelliJ IDEA新UI预览版

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于IDEA的预览版 IDEA会启…

    技术杂谈 2023年7月10日
    091
  • Webpack2学习记录-2

    这篇在 webpack-demo 目前下新建一个 w2 目录,学习 webpack.config.js 及 与 npm scripts 的使用。 1、w2 下新建一个 webpac…

    技术杂谈 2023年6月1日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球