iOS中深拷贝与浅拷贝

2023-10-28 09:48
文章标签 ios 拷贝 中深

本文主要是介绍iOS中深拷贝与浅拷贝,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

iOS中深拷贝与浅拷贝

浅拷贝

浅拷贝并不是拷贝对象本身,而是对指向对象的指针进行拷贝,但还是指向同一块堆内存中指针指向的对象。

可以看出浅拷贝中栈内存中指针对象的地址改变了,但还是指向相同的一块堆内存地址

  • 可以看出浅拷贝中栈内存中指针对象的地址改变了,但还是指向相同的一块堆内存地址
深拷贝

直接拷贝对象到内存中的一块区域,然后把新对象的指针指向这块内存。

在这里插入图片描述

  • 可以看出深拷贝是直接拷贝对象到内存中的一块区域(分配了一块新的内存空间),然后把新对象的指针指向这块内存,原对象和被赋值对象互不影响。

深拷贝与浅拷贝的本质区别

在于是否在堆内存中开辟新的内存空间。

注意

所有继承于NSObject的class都声明了copy和mutableCopy,但是并没有实现NSCopying和NSMutableCopying协议,所以Foundation框架中要使用copy方法要实现NSCopying、NSMutableCopying协议的。

区分深拷贝与浅拷贝

主要从 容器类非容器 类着手,不管是容器类还是非容器类都有可变对象和不可变对象,所以分为四种:

  • 非容器类不可变对象:NSString
  • 非容器类可变对象:NSMutableString
  • 容器类不可变对象:NSArray
  • 容器类可变对象:NSMutableArray

Show me the code.

1. 非容器类不可变对象:NSString

在这里插入图片描述
输出:

可以看出非容器类不可变对象调用copy方法只是把当前对象的指针指向原对象的地址,而调用mutableCopy方法则是分配了一块新的内存区域并把新对象的指针指向这块内存区域。

2. 非容器类可变对象:NSMutableString
在这里插入图片描述
输出:
在这里插入图片描述

可以看出非容器类可变对象不管是调用copy方法,还是调用mutableCopy方法,都重新开辟了一块新的内存区域。需要注意的是:可变对象调用copy方法后返回的是不可变对象,因此调用方法改变对象的时候程序会崩溃。

3. 容器类不可变对象:NSArray
在这里插入图片描述
输出:
在这里插入图片描述

可以看出容器类不可变对象调用copy和mutableCopy方法和非容器类不可变对象一样,调用copy方法还是对原对象指针的引用,调用mutableCopy开辟了一块新的内存区域。

4. 容器类可变对象:NSMutableArray
在这里插入图片描述
输出:
在这里插入图片描述

可以看出容器类可变对象还是和非容器类可变对象调用copy、mutableCopy方法一样,都开辟了一块新的内存区域。但容器内的元素任然是浅拷贝,因为修改数据后指针指向的对象地址和原对象的地址是一致的。

总结:

[object copy]:对于可变对象为深拷贝,不可变对象为浅拷贝。
[object mutableCopy]:始终都是深拷贝。

这篇关于iOS中深拷贝与浅拷贝的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Mysql中深分页的五种常用方法整理

《Mysql中深分页的五种常用方法整理》在数据量非常大的情况下,深分页查询则变得很常见,这篇文章为大家整理了5个常用的方法,文中的示例代码讲解详细,大家可以根据自己的需求进行选择... 目录方案一:延迟关联 (Deferred Join)方案二:有序唯一键分页 (Cursor-based Paginatio

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

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

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

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

Linux 使用rsync拷贝文件

显示进度条 rsync 可以显示进度条,您可以使用 --progress 或 -P 选项来显示每个文件的传输进度和已完成文件的统计信息。 显示进度条的常用选项: --progress 选项 使用 --progress 显示每个文件的传输进度信息:rsync -av --progress /src/ /dest/ -a:归档模式,表示递归拷贝并保持文件权限、时间戳等。-v:详细模式,显示更

python基础语法十一-赋值、浅拷贝、深拷贝

书接上回: python基础语法一-基本数据类型 python基础语法二-多维数据类型 python基础语法三-类 python基础语法四-数据可视化 python基础语法五-函数 python基础语法六-正则匹配 python基础语法七-openpyxl操作Excel python基础语法八-异常 python基础语法九-多进程和多线程 python基础语法十-文件和目录操作

插件maven-search:Maven导入依赖时,使用插件maven-search拷贝需要的依赖的GAV

然后粘贴: <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.26</version> </dependency>

JS手写实现深拷贝

手写深拷贝 一、通过JSON.stringify二、函数库lodash三、递归实现深拷贝基础递归升级版递归---解决环引用爆栈问题最终版递归---解决其余类型拷贝结果 一、通过JSON.stringify JSON.parse(JSON.stringify(obj))是比较常用的深拷贝方法之一 原理:利用JSON.stringify 将JavaScript对象序列化成为JSO