来点鸡汤:

// 所谓拷贝 就是在原有的对象的基础上产生一个新的副本对象.有两点原则:

//   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]深拷贝/浅拷贝区别的更多相关文章

  1. iOS深拷贝浅拷贝

    浅拷贝:浅拷贝并不拷贝对象本身,只是对指向对象的指针进行拷贝深拷贝:直接拷贝对象到内存中一块区域,然后把新对象的指针指向这块内存 在iOS中并不是所有对象都支持Copy和MutableCopy,遵循N ...

  2. python中赋值,深拷贝,浅拷贝区别

    这三种 的区别就是 复制的变量 是否是原变量的引用. 赋值:只是原变量的引用. 浅拷贝和深拷贝的区别 需要通过 子元素 区分 浅拷贝:子元素的 引用相同 深拷贝:所以引用都不相同,完全复制一份 这三种 ...

  3. C++浅拷贝和深拷贝的区别

    C++浅拷贝和深拷贝的区别 2012-04-24 21:22 11454人阅读 评论(6) 收藏 举报 c++deleteclass编译器c c++默认的拷贝构造函数是浅拷贝 浅拷贝就是对象的数据成员 ...

  4. Python FAQ2:赋值、浅拷贝、深拷贝的区别?

    在Python编程过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念,你的代码就可能出现一些问题.所以,在这里按个人的理解谈谈它们之间的区别. 一.赋值(assignment) 在<P ...

  5. JavaScript之深拷贝&浅拷贝

    深拷贝&浅拷贝,说起来都明白,但是说不出所以然.今天就系统的整理下思绪,一点点的将其分析出所以然 废话不多说 浅拷贝 简单的说就是一个值引用,学生时代接触过编程的人都应该了解过指针,浅拷贝可以 ...

  6. 【04】Python 深拷贝浅拷贝 函数 递归 集合

    1 深拷贝浅拷贝 1.1 a==b与a is b的区别 a == b    比较两个对象的内容是否相等(可以是不同内存空间) a is b  比较a与b是否指向同一个内存地址,也就是a与b的id是否相 ...

  7. 我的小前端 (1)—— 安卓机和ios机的区别

    没有什么特别新技术,就是记录我做移动端遇到的问题 2016-02-16 微信,支付宝和APP都会遇到这些问题 一.安卓机和ios机的区别 1.常用 <head>        <me ...

  8. c# 内存的具体表现- 通用类型系统 深拷贝 浅拷贝 函数传参

    c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下, ...

  9. python集合增删改查,深拷贝浅拷贝

    集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...

随机推荐

  1. docker之容器数据持久化

    1.挂载本地目录为容器的数据存放目录 [root@node03 ~]# docker run -itd --name web01 -v /container_data/web:/data ubuntu ...

  2. 阿里云 ECS 监控报警设置

    1.阿里云监控项说明 https://helpcdn.aliyun.com/document_detail/43505.html 2.监控设置 3.报警规则 4.设置阈值 5.确定即可. 6.效果图

  3. python中列表的常用操作增删改查

    1. 列表的概念,列表是一种存储大量数据的存储模型. 2. 列表的特点,列表具有索引的概念,可以通过索引操作列表中的数据.列表中的数据可以进行添加.删除.修改.查询等操作. 3. 列表的基本语法 创建 ...

  4. OD之去除nag弹窗(四)

    在某些方面,一个软件如果没有注册的话,老是会弹出烦人的注册弹窗,就如下图一样: 出现了两次弹窗,开始一次,关闭后又一次,老办法,拖进OD进行分析;不过看出程序很简单,就出现了messagebox的调用 ...

  5. Java 面向对象之构造方法

    01构造方法引入 A:构造方法的引入 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是在创建对象 ...

  6. PAT甲题题解-1064. Complete Binary Search Tree (30)-中序和层次遍历,水

    由于是满二叉树,用数组既可以表示父节点是i,则左孩子是2*i,右孩子是2*i+1另外根据二分搜索树的性质,中序遍历恰好是从小到大排序因此先中序遍历填充节点对应的值,然后再层次遍历输出即可. 又是一道遍 ...

  7. 20135337朱荟潼 Linux第五周学习总结——扒开系统调用的三层皮(下)

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 一.学习内容 (一 ...

  8. 基于SSH框架的网上书店系统开发的质量属性

    基于SSH框架的网上书店系统开发的质量属性 对于我的基于SSH框架的网上书店系统的开发要实现的质量属性有可用性.可修改性.性能.安全性.易用性和可测试性. 1.对于可用性方面的战术: 可用性(Avai ...

  9. Java 笔记——在 IDEA 中使用 Maven 配置和使用 MyBatis

    1.前言 MyBatis 是什么? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. ...

  10. nodeJs上传附件

    两种方案: 这两种方案传参还是有区别额 在nodeJs中上传附件调用了 multer 的中间件,采用这个中间件来上传 首先是表单(前端部分): <!DOCTYPE html> <ht ...