(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

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧