来点鸡汤:

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

//   1. 改变原对象的属性和行为不会影响副本对象

//   2. 改变副本对象的属性和行为不会影响原对象


来段示例代码
  1. - (void)viewDidLoad {
  2.     [super viewDidLoad];
  3. /##########################################/
  4.     // 以NSArray 为例
  5.    /##########################################/
  6.     
  7.     // 1. 不可变对象调用copy方法
  8.     NSArray *arr1 = [NSArray arrayWithObjects:@"1", nil];
  9.     // 不会产生新对象
  10.     NSArray *copyArr1 = [arr1 copy];
  11.     
  12.     NSLog(@"%p, %p\n", arr1, copyArr1);
  13.     NSLog(@"%ld, %ld\n", [arr1 retainCount], [copyArr1 retainCount]); // 字符串引用计数-1
  14.    /##########################################/
  15. // 打印结果
  16. **0x7fbdd340dbf0, 0x7fbdd340dbf0**
  17. 2, 2
  18. // 这个为浅拷贝, 没有产生新对象, copyArr1还是指向arr1的地址
  19. ![1.不可变对象调用copy方法.png](//upload-images.jianshu.io/upload_images/1400788-107ba7070e903e47.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  20.     /##########################################/
  21.     // 2. 不可变对象调用mutableCopy方法
  22.     NSArray *arr2 = [NSArray arrayWithObjects:@"2", nil];
  23.     // 会产生新的可变对象
  24.     NSArray *mutableCopyArr2 = [arr2 mutableCopy];
  25.     
  26.     NSLog(@"%p, %p\n", arr2, mutableCopyArr2);
  27.     NSLog(@"%ld, %ld", [arr2 retainCount], [mutableCopyArr2 retainCount]);
  28.    /##########################################/
  29. // 打印结果
  30. **0x7fbdd3600250, 0x7fbdd36445ba**
  31. 1, 1
  32. // 这个为深拷贝, 产生新的对象, 引用计数分别为1
  33. ![2.不可变对象调用mutableCopy方法.png](//upload-images.jianshu.io/upload_images/1400788-e0b7176e1cbca7c7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  34.     /##########################################/
  35.     // 3. 可变对象调用copy方法
  36.     NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:@"3", nil];
  37.     // 会产生不可变对象
  38.     id copyArr3 = [arr3 copy];
  39.     
  40.     NSLog(@"%@, %p, %p\n", [copyArr3 class], arr3, copyArr3);
  41.     NSLog(@"%ld, %ld", [arr3 retainCount], [copyArr3 retainCount]);
  42.    /##########################################/
  43. // 打印结果
  44. **__NSArrayI, 0x7fb120f12a40, 0x7fb120f10c70**
  45. 1, 1
  46. // NSArrayI代表不可变数组, 这个为深拷贝, 产生新对象(由可变对象变成不可变对象), 引用计数分别为1
  47. ![3.可变对象调用copy方法.png](//upload-images.jianshu.io/upload_images/1400788-ba00f376633b7f8c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  48.    /##########################################/    
  49.     // 4. 可变对象调用mutableCopy方法
  50.     NSMutableArray *arr4 = [NSMutableArray arrayWithObjects:@"4", nil];
  51.     
  52.     // 会产生可变对象
  53.     id mutableCopyArr4 = [arr4 mutableCopy];
  54.     
  55.     NSLog(@"%@, %p, %p", [arr4 class], arr4, mutableCopyArr4);
  56.     NSLog(@"%ld, %ld", [arr4 retainCount], [mutableCopyArr4 retainCount]);
  57. /##################################################/    
  58. // 打印结果
  59. **__NSArrayM, 0x7fc06062f930, 0x7fc06052f960**
  60. 1, 1
  61. // NSArrayM代表可变数组, 这个为深拷贝, 地址不同, 引用计数分别为1
  62. ![4.可变对象调用mutableCopy方法.png](//upload-images.jianshu.io/upload_images/1400788-16bd08da342a095c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  63. /##################################################/    
  64. //    总结:
  65.     /*
  66.      只有在第一种情况才是浅复制
  67.      运用copy的终极目的是: 当我赋值后,改变旧值不会影响新值. 如果要改变,就用retain
  68.      浅拷贝: 好比是你的影子, 你完了, 影子也完了.
  69.      深拷贝: 好比是你的克隆人, 你完了, 克隆人还在.
  70.      
  71.      */
  72.     
  73. }

[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. NodeMCU学习(三) : 进入网络世界

    把NodeMCU连接到路由器网络上 NodeMCU可以被配置为Station模式和softAP模式或者Station + AP模式,当它被配置为Station模式时,就可以去连接Access Poin ...

  2. jmeter分布式压力测试之添加压力机

    前提:多台电脑可以互相ping通 1.jmeter的bin目录下的jmeter.properties配置文件里面remote_hosts添加测试机的 IP:端口号,用英文“,”逗号间隔例如:remot ...

  3. linuxC/C++面试问题总结整理

    linuxC/C++面试问题总结整理 因为一些原因重新找工作了,面的linux c/c++,这里把面试中经常碰到的问题总结一下. linuxC/C++面试问题总结整理 单元测试 关键字const 关键 ...

  4. CodeMirror 小册子

    User manual and reference guide      version 5.41.1 用户手册和参考指南 CodeMirror is a code-editor component ...

  5. PAT甲题题解-1046. Shortest Distance (20)-做了一个假的最短路,水

    一开始以为是最短路,结果是给你一个环,让你求环上两点之间的距离...那还做毛线 然而还是得做毛线 #include <iostream> #include <cstdio> # ...

  6. Linux第五章笔记

    5.1 与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层. 主要作用有: 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进程都需要运行在虚拟机内 5.2 AP ...

  7. Yale数据库上的人脸识别

    一.问题分析 1. 问题描述 在Yale数据集上完成以下工作:在给定的人脸库中,通过算法完成人脸识别,算法需要做到能判断出测试的人脸是否属于给定的数据集.如果属于,需要判断出测试的人脸属于数据集中的哪 ...

  8. DirectoryEntry_Properties属性的遍历(win2003)

    DirectoryEntry root = new DirectoryEntry(@"IIS://localhost/W3SVC"); string PInfo = "& ...

  9. Android-TabLayout设置内容宽度以及下划线宽度

    默认图: 效果图: 项目中使用到需要像今日头条那种实现顶部横向滑动标题功能,本人项目中使用TabLayout+ViewPager实现,但是,实现后默认的TabLayout间距特别大,并且下划线,文字大 ...

  10. multer详解

    Express默认并不处理HTTP请求体中的数据,对于普通请求体(JSON.二进制.字符串)数据,可以使用body-parser中间件.而文件上传(multipart/form-data请求),可以基 ...