一、为什么使用复制?

1.C语言以及Objective-C语言总是按值传递的,按值传递意味着是隐式复制。在这里就分为两种情况:
   (1)如果是非对象类型,对传递过来的值进行更改,只会更改副本,对原始值没有影响,比如:int a = 3; int b; b = a, b = 4; 现在b的值是4,但是a的值仍然是3。
   (2)如果是对象类型,则就不一样了。Objective-C对象总是作为指针传递的,而且指针本身是隐式复制的,不会复制指针对应的对象,此时没有副本。当对传递过来的指针进行更改操作时,操作的还是原始对象。
2.假如说我们需要传递一个指针给一个对象,但是希望确保原始对象不会更改,这时候就用到了复制。复制操作将创建一个原始对象的副本,并且将副本的指针返回,这样两个指针将指向不同的对象,原始对象的值将不会再受影响。
二、NSCopying协议和NSMutableCopying协议
1.NSObject类的实例方法:copy和mutableCopy,对应对象类型的复制操作。但是如果一个对象要想支持copy方法,需要实现NSCopying协议并实现copyWithZone:方法,mutableCopy方法对应NSMutableCopying协议和mutableCopyWithZone:方法。
2.当对一个支持NSCopying协议的类调用copy方法时,NSObject默认会调用copyWithZone:方法,并将返回值返回给copy方法。假如对一个没有实现NSCopying协议的对象调用copy方法时,将会发生异常。NSMutableCopying协议同理。
3.copy方法,得到的是不可变的对象,不管之前是不是。
   mutableCopy方法,得到的是可变的对象,不管之前是不是。
4.在Property中,如果使用了readonly和copy,则在set和get方法中,复制的时候使用的是copy方法,即返回的对象是只读的,如果使用readwrite,使用的则是mutableCopy方法。
三、深复制与浅复制:
1.浅复制:仅仅复制所考虑的对象,而不复制它引用的对象;
   深复制:把复制的对象和对象所引用的对象都复制一遍,并且尽可能进行深层的复制。
2.支持复制的cocoa类全部实现了复制模式,并且返回一个浅复制的副本。
3.用于不可变的类的copyWithZone:方法的实现,根本不需要创建副本。它足以返回一个指向对象的原始指针,因为在返回对象之后没有更改它的风险。函数体实现内容很简单:return [self retain];
4.浅复制实现方法:在协议实现中,首先创建一个新对象,并且将原对象包含的值赋值给新的对象,然后返回新对象。创建新对象要使用allocWithZone:方法。
5.深复制的实现方法:获得cocoa对象的深复制的一种方便的方式是使用归档和解档模式。当一个对象以及所包含的所有对象都支持NSCoding协议,就可以将一个对象以及包含的对象全部归档,然后再以解档的方式重建对象,从而获得深复制的对象。

Objective-C复制解析相关推荐

  1. 赋值、浅复制和深复制解析 以及get/set应用

    参考视频 参考文章 参考demo 首先将会用到的类及方法贴出来(实体类省去了get/set/toString方法以及无参构造) public class Books implements Clonea ...

  2. vertx.FileResolver文件解析

    FileResolver Class //文件复制解析,复制文件到cache directory 中 ,VM options : -Dvertx.disableFileCPResolving publ ...

  3. java定义语法解析器,java开发工具intellij idea使用教程:定义语法和解析器.pdf

    java开发工具intellij idea使用教程:定义语法和解析器.pdf 还剩 3页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 慧都 科技 -- ...

  4. Postgresql源码(66)insert on conflict语法介绍与内核执行流程解析

    相关: <Postgresql源码(66)insert on conflict语法介绍与内核执行流程解析>) <Postgresql源码(70)逻辑复制DecodeXLOG主要流程和 ...

  5. 网易分布式数据库多活架构的演进与实践

    本文根据周劲松老师在[deeplus直播第228期]线上分享演讲内容整理而成. 周劲松 网易杭州研究院资深研发工程师 来自网易数据科学中心,目前是网易分布式数据库DDB及网易数据运河NDC项目负责人. ...

  6. DNS and Bind (一)

    DNS and Bind ======================================================================== 概述: DNS(Domain ...

  7. Java多层翻页网络爬虫实战(以搜房网为例)

    目录 分析所要爬取的数据 爬虫框架 model main util parse db数据库操作 爬虫如何实现翻页地址拼接 网络爬虫如何解决主键重复问题 本文为原创博客,仅供技术学习使用.未经允许,禁止 ...

  8. 有限差分法在最优化问题中的应用

    这个主题包含两篇文章 有限差分法在最优化问题中的应用 (本文) 有限差分法在图像配准最优化中的应用 前言 通常情况下,图像处理或者计算机视觉中涉及到的最优化问题都有一个共同的特点:目标函数(objec ...

  9. PLY文档翻译——利用Python进行词法和语法分析

    PLY (Python Lex-Yacc) 文章目录 1. Preface and Requirements 2. Introduction 3. PLY Overview 4. Lex 4.1 Le ...

最新文章

  1. cmake使用示例与整理总结_QTVLC的博客-CSDN博客_cmake使用示例与整理 施公队演示时用的blog B zhan
  2. Objective-C学习笔记(十九)——对象方法和类方法的相互调用
  3. latex使用小记录
  4. Secondary NameNode:它究竟有什么作用?(转自:http://blog.csdn.net/xh16319/article/details/31375197)
  5. 远程拷贝、查看端口、vim常见快捷键、查找替换命令、grep命令、查看存储空间的命令、chkconfig命令、系统自动启动级别、主机名配置、IP地址配置、域名映射、防火墙设置
  6. 永久白嫖!发现官方漏洞,希望不要被封杀!
  7. 使用selector改变按钮状态
  8. ElasticSearch聚合分析
  9. 我是如何查找RFC官方资料的
  10. 高调复出却无人买单!预售6小时,仅几百人预约
  11. Linux环境下的LD_PRELOAD:库预加载
  12. 建设“智慧法院” 引入庭审语音识别系统
  13. 【模拟信号】基于matlab标准调幅信号产生+解调【含Matlab源码 984期】
  14. KNN算法 使用KNN对iris数据集分类
  15. 全渠道会员通-天猫会员通3: 会员运营内容准备
  16. 数字签名的生成和验证
  17. 爬取双色球的历史记录
  18. java编写活期储蓄帐目管理_活期储蓄账目管理系统
  19. 浅析android手游lua脚本的加密与解密
  20. Flink的Source端和Sink端大全

热门文章

  1. Shell命令-磁盘与文件系统之dumpe2fs、dump
  2. webpack轻松入门教程
  3. php分享二十四:数组
  4. 查看Oracle有哪些表或者视图
  5. 第4章 分治策略 monge阵列
  6. 《世界因你而不同-李开复自传》读书笔记(1/3)
  7. source insight常用命令--实际使用中比较常用的
  8. 淘宝灵活的圆角框--通过一个圆形图片形成圆角原理
  9. 怎样使用Eclipse来开发Android源码
  10. 剑指 Offer 68 - II. (二叉树)二叉树的最近公共祖先