iOS copy的正确姿势

server/2024/10/21 9:15:57/

参考文章

知识准备(理解堆栈)

  • 堆区:
  • 程序员管理
  • 若程序员不释放,由os释放
  • 不同于数据结构中的堆,堆区的结构类似于数据结构中的链表
  • 栈区:
  • 由编译器来管理
  • 存放函数参数值,局部变量的值等
  • 结构类似于数据结构中的栈

copy和mutableCopy用途

需要创建一个对象,且该对象跟源对象内容相同,这是需要用到拷贝

常见的一些copy使用场景

NSString *string = @"Jerry"; [string copy] --> 拷贝出内容为Jerry的NSString类型的字符串 [string mutableCopy] --> 拷贝出内容为Jerry的NSMutableString类型的字符串
 
NSDictionary *dict = @{@"name" : @"Jerry"}; [dict copy] --> 拷贝出内容与dict相同的NSDictionary类型的字典 [dict mutableCopy] --> 拷贝出内容与dict相同的NSMutableDictionary类型的字典
 
NSArray *array = @[@"Jerry"]; [array copy] --> 拷贝出内容与array相同的NSArray类型的数组 [array mutableCopy] --> 拷贝出内容与array相同的NSMutableArray类型的数组

总结

  • copy产生的对象一定是ns*对象(不可变对象),而mutableCopy产生的对象一定是nsMutable*对象(可变对象)
  • 只有ns* 调用copy得到的对象才是浅拷贝对象,其余搭配都是深拷贝对象
  • ** 注意copy得到的对象不一定是浅拷贝,但是mutableCopy一定是深拷贝 **

参考下面图片来理解

参考图片

深拷贝的两种情况(自己起的名字_)

  • 完全拷贝:容器拷贝,容器内的对象也拷贝
  • 不完全拷贝:只拷贝容器,容器内的对象不拷贝** (系统默认情况是我,如果需要改成完全拷贝,需要重写copyWithZone) **
代码演示
// Person.m
- (id)copyWithZone:(NSZone *)zone
{
Person *cpyPerson = [[Person allocWithZone:zone] init];
cpyPerson.name = self.name;
cpyPerson.age = self.age;
return cpyPerson;
}
// NSArray
- (id)copy
{
NSArray *cpyArray = [[NSArray alloc] initWithArray:self copyItems:YES];
return cpyArray;
} 

// main.m
Person *p1 = [[Person alloc] init];
Person *p2 = [[Person alloc] init];
NSArray *array = @[p1, p2];
NSArray *cpyArray = [array copy];
NSLog(@"%@ - %@", array, cpyArray);

// 输出结果
(
"<Person: 0x100204af0>",
"<Person: 0x100206b20>"
) - (
"<Person: 0x100207910>",
"<Person: 0x1002074d0>"
)

注意点

由于oc的多态,会导致对象不确定是什么

示例代码

这是输出
array = (
Kobe,
McGragy
), mArray = (
Kobe,
McGragy
)

** 所以表面上self.array是NSArray对象, 其实骨子里是NSMutableArray对象,开发中应该使用下面的代码 **

示例代码


http://www.ppmy.cn/server/41664.html

相关文章

矩阵的特征分解

参考资料&#xff1a;矩阵的特征分解

关于大语言模型的论文和学习资源集合

Milestone Papers DatekeywordsInstitutePaperPublication2017-06TransformersGoogleAttention Is All You NeedNeurIPS2018-06GPT 1.0OpenAIImproving Language Understanding by Generative Pre-Training2018-10BERTGoogleBERT: Pre-tra

【算法刷题day53】Leetcode:1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

文章目录 Leetcode 1143. 最长公共子序列解题思路代码总结 Leetcode 1035. 不相交的线解题思路代码总结 Leetcode 53. 最大子数组和解题思路代码总结 草稿图网站 java的Deque Leetcode 1143. 最长公共子序列 题目&#xff1a;1143. 最长公共子序列 解析&#xff1a;[代码随想录…

android原生开发学习路线

基础知识&#xff1a; 学习Java语言基础&#xff0c;包括面向对象编程、数据结构、算法等。了解Android操作系统的基本概念&#xff0c;包括它的架构和组件。 Android开发环境搭建&#xff1a; 安装Android Studio&#xff0c;这是官方推荐的集成开发环境(IDE)。配置Android SD…

QT学习(1)——创建第一个QT程序,信号和槽,打开关闭窗口的案例

目录 引出规范和帮助文档创建第一个Qt程序对象树概念信号signal槽slot自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重载带参数的按钮触发信号触发信号拓展 lambda表达式返回值mutable修饰案例 打开关闭窗口案例 总结 引出 QT学习&#xff08;1&#…

HVV面试题2024护网蓝队面试题

一. 目前有防火墙&#xff0c;全流量检测&#xff0c;态势感知&#xff0c;IDS&#xff0c;waf&#xff0c;web服务器等设备&#xff0c;如何搭建一个安全的内网环境&#xff0c;请给出大概拓扑结构 &#xff08;适用于中高级&#xff09; 搭建安全内网环境拓扑结构&#xff1…

数组中求本元素临近下一个比它大的数(c实现)

题目描述 有一个数组&#xff0c;请找出数组中每个元素的下一个比它大的元素。 要求&#xff1a; 给定一个int数组arr以及数组大小为n&#xff0c;请返回一个int数组,代表每个元素比它大的下一个元素&#xff0c;若不存在返回-1&#xff0c;原数组中的元素都为正整数。 测试…

Java面向对象——多态

即同一个方法可以根据发送对象的不同而采用多种不同的行为方式。 一个对象的实际类型是确定的&#xff0c;但可以指向对象的引用的类型有很多&#xff08;父类&#xff0c;有关系的类&#xff09;。 多态存在的条件&#xff1a; 1. 有继承关系&#xff1b; 2. 子类重写父类…