[iOS]深拷贝/浅拷贝区别
来点鸡汤:
// 所谓拷贝 就是在原有的对象的基础上产生一个新的副本对象.有两点原则:
// 1. 改变原对象的属性和行为不会影响副本对象
// 2. 改变副本对象的属性和行为不会影响原对象
来段示例代码
- (void)viewDidLoad {
[super viewDidLoad];
/##########################################/
// 以NSArray 为例
/##########################################/
// 1. 不可变对象调用copy方法
NSArray *arr1 = [NSArray arrayWithObjects:@"1", nil];
// 不会产生新对象
NSArray *copyArr1 = [arr1 copy];
NSLog(@"%p, %p\n", arr1, copyArr1);
NSLog(@"%ld, %ld\n", [arr1 retainCount], [copyArr1 retainCount]); // 字符串引用计数-1
/##########################################/
// 打印结果
**0x7fbdd340dbf0, 0x7fbdd340dbf0**
2, 2
// 这个为浅拷贝, 没有产生新对象, copyArr1还是指向arr1的地址
![1.不可变对象调用copy方法.png](//upload-images.jianshu.io/upload_images/1400788-107ba7070e903e47.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
/##########################################/
// 2. 不可变对象调用mutableCopy方法
NSArray *arr2 = [NSArray arrayWithObjects:@"2", nil];
// 会产生新的可变对象
NSArray *mutableCopyArr2 = [arr2 mutableCopy];
NSLog(@"%p, %p\n", arr2, mutableCopyArr2);
NSLog(@"%ld, %ld", [arr2 retainCount], [mutableCopyArr2 retainCount]);
/##########################################/
// 打印结果
**0x7fbdd3600250, 0x7fbdd36445ba**
1, 1
// 这个为深拷贝, 产生新的对象, 引用计数分别为1
![2.不可变对象调用mutableCopy方法.png](//upload-images.jianshu.io/upload_images/1400788-e0b7176e1cbca7c7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
/##########################################/
// 3. 可变对象调用copy方法
NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:@"3", nil];
// 会产生不可变对象
id copyArr3 = [arr3 copy];
NSLog(@"%@, %p, %p\n", [copyArr3 class], arr3, copyArr3);
NSLog(@"%ld, %ld", [arr3 retainCount], [copyArr3 retainCount]);
/##########################################/
// 打印结果
**__NSArrayI, 0x7fb120f12a40, 0x7fb120f10c70**
1, 1
// NSArrayI代表不可变数组, 这个为深拷贝, 产生新对象(由可变对象变成不可变对象), 引用计数分别为1
![3.可变对象调用copy方法.png](//upload-images.jianshu.io/upload_images/1400788-ba00f376633b7f8c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
/##########################################/
// 4. 可变对象调用mutableCopy方法
NSMutableArray *arr4 = [NSMutableArray arrayWithObjects:@"4", nil];
// 会产生可变对象
id mutableCopyArr4 = [arr4 mutableCopy];
NSLog(@"%@, %p, %p", [arr4 class], arr4, mutableCopyArr4);
NSLog(@"%ld, %ld", [arr4 retainCount], [mutableCopyArr4 retainCount]);
/##################################################/
// 打印结果
**__NSArrayM, 0x7fc06062f930, 0x7fc06052f960**
1, 1
// NSArrayM代表可变数组, 这个为深拷贝, 地址不同, 引用计数分别为1
![4.可变对象调用mutableCopy方法.png](//upload-images.jianshu.io/upload_images/1400788-16bd08da342a095c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
/##################################################/
// 总结:
/*
只有在第一种情况才是浅复制
运用copy的终极目的是: 当我赋值后,改变旧值不会影响新值. 如果要改变,就用retain
浅拷贝: 好比是你的影子, 你完了, 影子也完了.
深拷贝: 好比是你的克隆人, 你完了, 克隆人还在.
*/
}
[iOS]深拷贝/浅拷贝区别的更多相关文章
- iOS深拷贝浅拷贝
浅拷贝:浅拷贝并不拷贝对象本身,只是对指向对象的指针进行拷贝深拷贝:直接拷贝对象到内存中一块区域,然后把新对象的指针指向这块内存 在iOS中并不是所有对象都支持Copy和MutableCopy,遵循N ...
- python中赋值,深拷贝,浅拷贝区别
这三种 的区别就是 复制的变量 是否是原变量的引用. 赋值:只是原变量的引用. 浅拷贝和深拷贝的区别 需要通过 子元素 区分 浅拷贝:子元素的 引用相同 深拷贝:所以引用都不相同,完全复制一份 这三种 ...
- C++浅拷贝和深拷贝的区别
C++浅拷贝和深拷贝的区别 2012-04-24 21:22 11454人阅读 评论(6) 收藏 举报 c++deleteclass编译器c c++默认的拷贝构造函数是浅拷贝 浅拷贝就是对象的数据成员 ...
- Python FAQ2:赋值、浅拷贝、深拷贝的区别?
在Python编程过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念,你的代码就可能出现一些问题.所以,在这里按个人的理解谈谈它们之间的区别. 一.赋值(assignment) 在<P ...
- JavaScript之深拷贝&浅拷贝
深拷贝&浅拷贝,说起来都明白,但是说不出所以然.今天就系统的整理下思绪,一点点的将其分析出所以然 废话不多说 浅拷贝 简单的说就是一个值引用,学生时代接触过编程的人都应该了解过指针,浅拷贝可以 ...
- 【04】Python 深拷贝浅拷贝 函数 递归 集合
1 深拷贝浅拷贝 1.1 a==b与a is b的区别 a == b 比较两个对象的内容是否相等(可以是不同内存空间) a is b 比较a与b是否指向同一个内存地址,也就是a与b的id是否相 ...
- 我的小前端 (1)—— 安卓机和ios机的区别
没有什么特别新技术,就是记录我做移动端遇到的问题 2016-02-16 微信,支付宝和APP都会遇到这些问题 一.安卓机和ios机的区别 1.常用 <head> <me ...
- c# 内存的具体表现- 通用类型系统 深拷贝 浅拷贝 函数传参
c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下, ...
- python集合增删改查,深拷贝浅拷贝
集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...
随机推荐
- centos 7部署ELK
一.ELK介绍 Elasticsearch 是基于 JSON 的分布式搜索和分析引擎,专为实现水平扩展.高可用和管理便捷性而设计.Logstash 是动态数据收集管道,拥有可扩展的插件生态系统,能够与 ...
- wpf-典型的mvvm模式通用中小型管理系统框架0
之前就一直在想着写这么一系列博客,将前段时间(也算有点久了)自己编写的一套框架分享下,和园子里的诸位大牛交流交流,奈何文思枯竭,提键盘而无从敲起,看来只有coding时才不会有这种裤子都脱了,才发现对 ...
- Java 笔记——在 IDEA 中使用 Maven 配置和使用 MyBatis
1.前言 MyBatis 是什么? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. ...
- 侧边导航栏css示例
效果展示: html: <div class="sidebar"> <ul> <li>优先级 <ul> <li>< ...
- everything 提供http和ftp的功能
1. 早上起床看知乎,发现everything 有http和ftp的功能, 简单看了一下的确很强大.. 就是有点危险.. 功能位置. 2. 最下面有FTP和HTTP 可以进行启用 这是http的 建议 ...
- [转帖] Linux 下面 Find的使用...--- 自己不会用 find
13个实用的Linux find命令示例 原始博客地址: https://www.cnblogs.com/chenshoubiao/p/4838089.html 之前只会用locate 基础 ...
- java 枚举 封装操作方法
前言: 由于刚转java项目,所以对于java语言比较陌生,尤其是lambda和一些诸如(一个java文件只能有一个public class)等等的零散知识点之类... 使我觉得就语言的层级来说..n ...
- gym101350 c h m
C. Cheap Kangaroo time limit per test 1.0 s memory limit per test 256 MB input standard input output ...
- MT【80】单调性求函数表达式
提示:$f(f(f(x)-lnx)-ln(f(x)-lnx))=1+e=f(f(x)-lnx),\because f(x)$单调.得: $f(f(x)-lnx)-ln(f(x)-lnx)=f(x)-l ...
- 自动化运维工之Ansible(1)
1.1 ansible简介 1.1.1 .Ansible软件介绍: Ansible提供一种最简单的方式用于发布.管理和编排计算机系统的工具,可在数分钟内搞定.Ansible由Python语言开发, 默 ...