(0087)iOS开发之NSString属性为什么要用copy来修饰?

2023-12-03 20:32

本文主要是介绍(0087)iOS开发之NSString属性为什么要用copy来修饰?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这个问题既是一个面试题,也是开发中经常遇到的问题,NSString 属性到底用copy 还是 strong ?其实如果明白的两者的区别也就不会疑惑了,其实都可以,只是如果你不明白两者的实质的区别,有可能会出现难以发现的异常。但是我们遇到的又很少所有经常用哪个都行,但是不知道有何区别,在此我实际验证一下。记录这个经常模糊不清的问题。

 

1.快速搭建一个demo

- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.NSLog(@"\n");// 验证不可变对象NSString[self test];// 验证可变对象NSMutableString// [self test22];// 如果用NSString赋值的话strong和copy(此刻是浅拷贝)是没有区别的// 如果用NSMutableString赋值的话strong没有只是增加了str1的计数器,并没有开辟新的内存// copy的话开辟了新的内存,对string的内容进行修改的话,strong的字符串内容改变了,而copy的并没有改变// 如果需要改变的话可以用strong,如果不需要改变的话用copy// 所以属性指向可变对象时应注意;
}
- (void)test{NSString *string = [NSString stringWithFormat:@"测试文字"];//注释1self.strongStr = string;self.copyssStr = string;NSLog(@"String:%@   strongStr:%@   copyssStr:%@",string,self.strongStr,self.copyssStr);NSLog(@"String   : %p, %p", string, &string);NSLog(@"Strong属性: %p, %p",_strongStr, &_strongStr);NSLog(@"Copy  属性: %p, %p",_copyssStr, &_copyssStr);NSLog(@"\n");string = @"我变了,你没变";NSLog(@"我变 String:%@   strongStr:%@   copyssStr:%@",string,self.strongStr,self.copyssStr);NSLog(@"我变 String   : %p, %p", string, &string);NSLog(@"我变 Strong属性: %p, %p",_strongStr, &_strongStr);NSLog(@"我变 Copy  属性: %p, %p",_copyssStr, &_copyssStr);// NSString总结:用NSString赋值的话strong和copy(此刻是浅拷贝)是没有区别的;从新赋值,相当于指向了新的一个对象,string指向变了,而strong和copy指针(此刻是浅拷贝// 还是指向的原来的对象,所以说不变。// 所以不可变对象的copy 和strong 与可变对象的copy 一样效果,赋值后copy 和 strong 指针指向的值都不变;/*1. 当原字符串是NSMutableString时,Strong属性只是增加了原字符串的引用计数,而Copy属性则是对原字符串做了次深拷贝,产生一个新的对象,且Copy属性对象指向这个新的对象,且这个Copy属性对象的类型始终是NSString,而不是NSMutableString,因此其是不可变的。2. 这里还有一个性能问题,即在原字符串是NSMutableString,Strong是单纯的增加对象的引用计数,而Copy操作是执行了一次深拷贝,所以性能上会有所差异(虽然不大)。如果原字符串是NSString时,则没有这个问题。所以,在声明NSString属性时,到底是选择strong还是copy,可以根据实际情况来定。不过,一般我们将对象声明为NSString时,都不希望它改变,所以大多数情况下,我们建议用copy,以免因可变字符串的修改导致的一些非预期问题。*/
}
- (void)test22{//NSMutableString *string = [NSMutableString stringWithFormat:@"测试文字"];self.strongStr = string;self.copyssStr = string;NSLog(@"String:%@   strongStr:%@   copyssStr:%@",string,self.strongStr,self.copyssStr);NSLog(@"String 地址: %p, %p", string, &string);NSLog(@"Strong 地址: %p, %p",_strongStr, &_strongStr);NSLog(@"Copy   地址: %p, %p",_copyssStr, &_copyssStr);NSLog(@"\n");[string appendString:@"我变了,你没变"];NSLog(@"append 后 String:%@   strongStr:%@   copyssStr:%@",string,self.strongStr,self.copyssStr);NSLog(@"append 后 String 地址: %p, %p", string, &string);NSLog(@"append 后 Strong 地址: %p, %p",_strongStr, &_strongStr);NSLog(@"append 后 Copy   地址: %p, %p",_copyssStr, &_copyssStr);NSLog(@"\n");// NSMutableString总结:// 如果string 的指针不变,内存地址不变,值变化,则strongStr 的值跟着变化,指针不变,地址不变;而copyssStr 则不会任何变化;string = [NSMutableString stringWithFormat:@"ccvcc"];NSLog(@"Mutable 后 String:%@   strongStr:%@   copyssStr:%@",string,self.strongStr,self.copyssStr);NSLog(@"Mutable 后 String 地址: %p, %p", string, &string);NSLog(@"Mutable 后 Strong 地址: %p, %p",_strongStr, &_strongStr);NSLog(@"Mutable 后 Copy   地址: %p, %p",_copyssStr, &_copyssStr);// 总结:Mutable 相当于重新alloc一个对象, string 指针的指向变了,指向了新的对象的地址,strongStr 指针不变,指向的还是原来对象的地址,地址不变;而copyssStr已经去string没有关系,则不会任何变化;// 这里我想验证下strongStr 指向的是原来的还是新的对象的[self performSelector:@selector(shows) withObject:nil afterDelay:10];
}
- (void)shows {NSLog(@"shows 后 strongStr:%@   copyssStr:%@",self.strongStr,self.copyssStr);
}

上面代码中有自己对比得出的结论,推出多用copy 是因为我们使用属性一般是全局的,不期望 *string被改变时,也改变了copy 属性的值。我们希望的是self.copyssStr = @"";来改变

参考:https://www.jianshu.com/p/8bbe01e53114

:https://blog.csdn.net/itianyi/article/details/9018567

:https://blog.csdn.net/summer_csdn123/article/details/52190879

:https://www.jianshu.com/p/b3873ac9259b

这篇关于(0087)iOS开发之NSString属性为什么要用copy来修饰?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/450782

相关文章

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

HTML5 data-*自定义数据属性的示例代码

《HTML5data-*自定义数据属性的示例代码》HTML5的自定义数据属性(data-*)提供了一种标准化的方法在HTML元素上存储额外信息,可以通过JavaScript访问、修改和在CSS中使用... 目录引言基本概念使用自定义数据属性1. 在 html 中定义2. 通过 JavaScript 访问3.