ios开发过程中,大体上会区分为两个概念:

  1. 对象(如NSString,NSNumber等类型)
  2. 容器(如NSArray,NSDictionary等类型)
  • 对象

    • copy后拿到的对象也是和copy的对象指向同一内存地址,copy的对象引用指数+1,拷贝的只是对象的一个指针是浅拷贝
    • mutablecopy后拿到的对象与mutablecopy的对象所处于内存不同的位置,内存的内容一样,拷贝对象引用计数不会+1,新拷贝出来的对象引用计数为1,拷贝的不单是内存内容,还新分配一块内存,是深拷贝
  • 容器
    • 也参照如上方法copy出来的对象是浅拷贝,mutablecopy出来的对象是深拷贝,但是需要记住,容器的包含对象(元素)的拷贝,对他们的容器无论使用copy得到的容器对象引用,还是mutablecopy得到的新容器对象,他们里面所包含的元素对象都将是浅拷贝。所有对新旧对象里面的元素修改都会影响上下文。
    • 要想实现对象的深拷贝,必须自己提供拷贝的方法。
    • 官方文档中介绍两种实现深拷贝的方法:
      • a.用Array的initWithArray: copyItems函数,如下:

        • NSArray *deepCopyArray=[[NSArray alloc] initWithArray: someArray copyItems: YES];
        • 调用后,会对原NSArray中的每个元素调用其copy函数,并把返回的id加入到新的数组中。所以这是依赖于Obj对象类实现的深拷贝,如果- (id)copywithZone:(NSZone*)zone是重新分配一块内存赋值后返回,那么就是真正的深拷贝。如果直接返回自身,那么它只是浅拷贝。
      • b.用archiver方式:
        • NSArray* trueDeepCopyArray = [NSKeyedUnarchiverunarchiveObjectWithData: [NSKeyedArchiver archivedDataWithRootObject:oldArray]];
        • 这是真正意义上的深拷贝,不依赖于实际类Copying协议的实现。
  • 对于拥有可变版本的类型如NSString,NSArray等使用copy与mutablecopy还需注意:
    1. copy得到的对象是不可变类型
    2. mutablecopy得到的对象是可变类型
    • 一不注意便会让一个可变类型的变量去持有copy出来的对象,然后调用变量的add或remove等方法程序便崩掉。

转载于:https://www.cnblogs.com/Jk-Chan/p/5271140.html

Objective-C中深拷贝与浅拷贝简述相关推荐

  1. Python中深拷贝与浅拷贝的区别?

    往期面试题: 列举Python中的标准异常类? 说说Python面向对象三大特性? 说说Python中有几种数据类型? 说说Python模块主要分哪三类? 废话不多说,开始今天的题目: 问:说说Pyt ...

  2. C++中深拷贝和浅拷贝

    C++中深拷贝和浅拷贝的问题是很值得我们注意的知识点,如果编程中不注意,可能会出现疏忽,导致bug.本文就详细讲讲C++深浅拷贝的种种. 对于一般的对象,如: C++代码 int a = 10; in ...

  3. js中深拷贝和浅拷贝问题

    最近在学习c++,以前从来没接触过也没想到过深拷贝和浅拷贝.c++里有深拷贝和浅拷贝,那么其它语言中应该也有. 本文参考: https://juejin.im/post/59ac1c4ef265da2 ...

  4. python中深拷贝与浅拷贝的区别

    ####################python中的数据类型####################### ##########python中的数据类型有6种,分别为:数字类型如int,float ...

  5. P110中 深拷贝与浅拷贝问题

    #include<iostream> using namespace std; //深拷贝与浅拷贝//浅拷贝带来的问题就是堆区的内存重复释放,要用 深拷贝来解决 class Person ...

  6. 浅析Python中深拷贝和浅拷贝

    按照以下不同情况,在IDE中逐个解除注释,就明白了 import copy""" 第一种情况,不可变类型变量,都是引用 """ # a = ...

  7. python中深拷贝和浅拷贝_**Python中的深拷贝和浅拷贝详解

    甚至连type其本身都是对象,type对象 Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型 来确认变量到底是什么类型. 单独赋 ...

  8. JAVA中深拷贝与浅拷贝(在网上找到的) 希望对于理解深拷贝与浅拷贝有帮助...

     什么是clone? 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就 ...

  9. python中深拷贝和浅拷贝

    转载于:https://www.cnblogs.com/mihoutao/p/10955858.html

最新文章

  1. 【计算机网络】传输层 : TCP 流量控制 ( 流量控制过程 | 持续计时器机制 )
  2. 一个包的TcpServer流程
  3. json绑定到实体_绑定到JSON和XML –处理集合
  4. [转]SQL Server 存储过程 一些常用用法(事物、异常捕捉、循环)
  5. sql注入python编程_Python编写SQL注入工具(2)
  6. 2012蓝桥杯【初赛试题】 取球游戏
  7. Java写的答题助手项目分析与总结(三)
  8. word使用技巧大全
  9. 各位老铁,善财读书会试运营了
  10. 计算机视觉与机器学习之6σ问题
  11. HH SaaS电商系统的虚拟资金账户(钱包余额)设计
  12. linux用户密码原则,linux系统普通用户设置密码
  13. PS CS6正版带序列号百度网盘下载地址
  14. 用ps做个一寸的照片
  15. 中国污水处理市场现状调研与投资前景预测分析报告2022年版
  16. 处理IRP的几种方式
  17. 北京,上海Java程序员的月薪水平?
  18. Unity3d下载大型文件并显示进度
  19. 九宫格按键输入c++
  20. 全国计算机软考程序员考试大纲

热门文章

  1. 知识技能归档--CA-PKI体系-20210324
  2. python文件的路径_如何从目录中给出python文件的路径
  3. PHP输出一段励志的话,一段励志的好句子,经典透彻!
  4. 插件安装失败_贴片保险丝额定电流应用电路为什么会安装失败?
  5. 第二章密码学基础与应用备考要点及真题分布
  6. python鼠标碰撞_Python+opencv第5节鼠标响应事件,pythonopencv,第五节
  7. double 保留两位小数
  8. 用Java实现在【520,1314】之间生成随机整数的故事
  9. 「 Luogu P2574 」 XOR的艺术——线段树
  10. C# 运行控制台程序中文乱码