iOS copy的正确姿势

参考文章

知识准备(理解堆栈)

  • 堆区:
  • 程序员管理
  • 若程序员不释放,由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.mzph.cn/pingmian/12168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Facebook消息群发脚本的制作思路!

在数字化社交日益盛行的今天&#xff0c;Facebook作为全球最大的社交平台之一&#xff0c;为企业和个人提供了广阔的交流与合作空间。 然而&#xff0c;手动向大量用户发送消息既耗时又低效&#xff0c;因此&#xff0c;开发一款能够自动群发消息的脚本成为了许多人的需求&…

MySQL数据库的详解(2)

1、一对多 定义 案例&#xff1a;员工表为子表&#xff0c;部门表为父表一对多关系实现&#xff1a;在数据库表中多的一方&#xff0c;添加字段&#xff0c;来关联一的一方的主键。 外键语法 -- 创建表时指定 create table 表名(字段名 数据类型,...[constraint] [外键…

【正点原子Linux连载】 第四十二章 多点电容触摸屏实验摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DLRK3568开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四十…

汇昌联信:拼多多网店该如何开店?

拼多多网店的开设流程并不复杂&#xff0c;但需要细心和耐心去完成每一步。下面将详细阐述如何开设一家拼多多网店。 一、选择商品与定位 开设拼多多网店的第一步是确定你要销售的商品类型&#xff0c;这决定了你的目标客户群体和市场定位。你需要了解这些商品的市场需求、竞争…

面向对象 06:三大特性之——多态,多态的基本概念和相关使用,关键字 instanceof,以及对象间的类型转换

一、前言 记录时间 [2024-05-14] 系列文章简摘&#xff1a; 面向对象 02&#xff1a;区分面向过程与面向对象&#xff0c;类和对象的关系 面向对象 03&#xff1a;类与对象的创建、初始化和使用&#xff0c;通过 new 关键字调用构造方法&#xff0c;以及创建对象过程的内存分析…

CAST: Cross-Attention in Space and Time for Video Action Recognition

标题&#xff1a;CAST: 时空交叉注意力网络用于视频动作识别 原文链接&#xff1a;2311.18825v1 (arxiv.org)https://arxiv.org/pdf/2311.18825v1 源码链接&#xff1a;GitHub - KHU-VLL/CASThttps://github.com/KHU-VLL/CAST 发表&#xff1a;NeurIPS-2023&#xff08;CCF A…

【打字】打字训练之针对性键盘区域练习

本文章的核心点是&#xff1a;使用代码生成自己想要训练的键位的词汇&#xff0c;然后导入到打字软件针对性练习 一个程序员突然想纠正打字习惯源于腱鞘炎&#xff0c;虽然使用双拼打字已经不慢了&#xff0c;但是姿势不是很正确&#xff0c;导致了腱鞘炎。 所以想着好好纠正指…

Golang——http包

Go语言内置的net/http包十分优秀&#xff0c;提供了http客户端和服务器的实现。 超文本传输协议(HTTP&#xff0c;HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络传输协议&#xff0c;所有的www文件都必须遵循这个标准。设计HTTP最初的目的是为了提供一种发布和…

消息队列选型

一、要解决的问题 1.1 异步 分析&#xff1a; 需要根据场景来判断。若整体链路的逻辑中&#xff0c;某些逻辑是不需要强实时的&#xff0c;滞后一段时间是允许的&#xff0c;同时又不会对用户带来不好的体验&#xff0c;那么可以使用MQ完成异步操作。 例如&#xff1a;秒杀场…

解锁客户需求密码:银行业数据分析在业务决策中的关键作用

一、引言 在数字化和大数据时代的浪潮下&#xff0c;银行业正经历着前所未有的变革。作为数据分析领域的资深专家&#xff0c;我深知数据分析在银行业务发展中的重要性和价值。本文将从银行业数据分析的角度出发&#xff0c;深入探讨相关业务场景下的数据分析应用&#xff0c;…

UVa11419 SAM I AM

UVa11419 SAM I AM 题目链接题意分析AC 代码 题目链接 UVA - 11419 SAM I AM 题意 给出一个 RC 大小的网格&#xff0c;网格上面放了一些目标。可以在网格外发射子弹&#xff0c;子弹会沿着垂直或者水平方向飞行&#xff0c;并且打掉飞行路径上的所有目标&#xff0c;如下图所…

Java 环境变量未生效

在配置 Java 环境变量的时候&#xff0c;有可能会出现修改了JDK的路径&#xff0c;但是Java的环境变量没有相应切换的情况。比如&#xff1a; 但此时在控制台使用java -version命令输出的JDK版本不是新配置的版本&#xff0c;依然是之前的&#xff0c;甚至提示找不到java命令&a…

汇昌联信科技:拼多多电商的运营流程有哪些?

在当今互联网高速发展的时代&#xff0c;电商平台层出不穷&#xff0c;其中拼多多以其独特的团购模式和低价策略迅速崛起&#xff0c;成为众多消费者和商家的新宠。那么&#xff0c;拼多多电商的运营流程究竟包含哪些环节呢?接下来&#xff0c;我们将从商品上架、营销推广、订…

B/S版+java开发的医院绩效考核系统maven+Visual Studio Code 医院绩效考核管理系统 提升医疗服务质量的关键

B/S版java开发的医院绩效考核系统mavenVisual Studio Code 医院绩效考核管理系统 提升医疗服务质量的关键 医院绩效评价系统的建设&#xff0c;优化医院绩效管理体系&#xff0c;规范化工作目标的设计、沟通、评价与反馈&#xff0c;改进和提供医院管理人员的管理能力和成效&am…

关于linux的防护,以及群集你要知道的有哪些1-系统安全及应用

1、系统账号清理 1)将非登录用户shell设为/sbin/nologin useradd -s /sbin/nologin 用户名 usermod -s /sbin/nologin 用户名 2)锁定长期不使用的账号 usermod -L 用户名 (usermod -U 解锁) passwd -l 用户名 (passwd -u 解锁)…

Nginx - location 指令(二)

location 指令 location [ | ~ | ~* | ^~ ] uri {}不讨论 location name {} 形式 官方文档有如下描述&#xff1a; A location can either be defined by a prefix string, or by a regular expression. Regular expressions are specified with the preceding ~* modifier (…

【Web】HNCTF 2024 题解(部分)

目录 Please_RCE_Me ezFlask GoJava ez_tp GPTS Please_RCE_Me <?php if($_GET[moran] flag){highlight_file(__FILE__);if(isset($_POST[task])&&isset($_POST[flag])){$str1 $_POST[task];$str2 $_POST[flag];if(preg_match(/system|eval|assert|call|…

Linux进程间几种通信机制

一. 简介 经过前一篇文章的学习&#xff0c; 我们知道Linux下有两种标准&#xff1a;system V标准和 Posix标准。 System V 和 POSIX 标准是操作系统提供的接口标准&#xff0c;它们规定了操作系统应该如何实现一些基本功能&#xff0c;比如线程、进程间通信、文件处理等。 …

数组的学习

一.数组定义方法&#xff1a; 方法一&#xff1a; 数组名(value0 value1 value2 ...) 方法二&#xff1a; 数组名([0]value [1]value [2]value ...) 方法三&#xff1a; 列表名"value0 value1 value2 ..." 数组名($列表名) 方法四&#xff1a; 数组名[0]"va…

暴雨分布式存储集群助重庆高校打造智慧校园

教育是国家发展的基石&#xff0c;教育兴则国家兴&#xff0c;教育强则国家强。党的二十大报告指出&#xff0c;“加快建设教育强国”&#xff0c;并提出到2035年“建成教育强国”的总体目标。随着数字时代的到来&#xff0c;以物联网、大数据、云计算和人工智能为代表的数字技…