IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解

深浅拷贝的基本概念和用法

  基本概念

浅拷贝纸复制对象的本身,对象里的属性、包含的对象不做复制

  深拷贝则既复制对象本身,对象的属性也会复制一份。

  Foundation 框架中支持复制的类,默认是浅拷贝。

  copy和mutabelCopy

  1. 一个对象使用copy和mutabelCopy方法可以创建对象的副本
  2. copy - 需要先实现NSCoppying协议,创建的是不可变副本(如NSString、NSArray、NSDictionary)
  3. mutabelCopy - 需要先实现NSMutabelCopying协议,创建的是可变副本,(如NSMutabelString、NSMutabelArray、NSMutabelDictionary)
  4. 深复制:内容拷贝,源对象和副本指向的是不同的两个对象。源对象引用计数器不变,副本计数器设置为1
  5. 浅复制:指针拷贝,源对象和副本指向的是同一个对象。对象的引用计数器+1,其实相当于做了一次retain操作
  6. 只有不可变对象创建不可变副本(copy)才是浅复制,其他都是深复制

举例:对象的自定义拷贝

对象拥有复制特性,须实现NSCopying、NSMutabelCopying协议,实现该协议的copyWithZone:方法和mutabelCopyWithZone:方法

代码:

深浅拷贝的不同实现;代码示例

  Objective - C 对象的深浅拷贝的区别就在于你对copyWithZone的不同实现

深浅拷贝和 retain之间的总结

  copy、mutabelCopy 和 retain 之间的关系

  • Foundation 可复制的对象,当我们copy的是一个不可变的对象时,他的作用相当于retain (cocoa做得内存优化)
  • 当我们使用mutabelCopy 时 ,无论源对象师傅可变,副本是可变的,并且实现了真正意义上得拷贝
  • 当我们copy 的是一个可变对象时,副本对象是不可变的,同样实现了真正意义上的拷贝

Foundation 的一些常见复制的案例

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

python的函数(二):作用域

我们在写函数时,时常需要引用全局的变量,或对全局变量赋值。又或者偶尔遇到局部变量与全局变量同名。在处理这些问题时,python语言的游戏规则是怎样的?今天我们就...

20750
来自专栏架构之路

JAVA基础知识点:内存、比较和Final

1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题。(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对...

49840
来自专栏阿凯的Excel

Python读书笔记5(字符串相关应用)

上期分享了Python相关的字符串应用,重点分享了转义字符。今天和大家分享和字符串相关的函数和应用。 一、字符串的合并! ? Python用“+”号可以连接...

38050
来自专栏java初学

java中 i = i++和 j = i++ 的区别

423100
来自专栏游戏开发那些事

【小白学C#】浅谈.NET中的IL代码

  前几天群里有位水友提问:”C#中,当一个方法所传入的参数是一个静态字段的时候,程序是直接到静态字段拿数据还是从复制的函数栈中拿数据“。其实很明显,这和方法参...

25720
来自专栏osc同步分享-java技术分享站

Timer类的schedule()方法

timer.schedule(new MyTask(),long time1,long timer2); 第一个参数,是 TimerTask 类,在包:impo...

361110
来自专栏公众号_薛勤的博客

Java多线程编程核心技术(二)对象及变量的并发访问

本文主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题。阅读本文应该着重掌握如下技术点:

12730
来自专栏進无尽的文章

基础篇-ObjectC继承、类别、属性

    在实际的开发过程中,继承和类别都会得到很多用处。对于界面相似度很高的情况下,使用继承可以节省很多代码和设置,只需要在子类中重写父类中的方法,或者增加新的...

8910
来自专栏Kevin-ZhangCG

[ Java面试题 ]泛型篇

22350
来自专栏编程

Python读书笔记5

上期分享了Python相关的字符串应用,重点分享了转义字符。今天和大家分享和字符串相关的函数和应用。 一、字符串的合并! Python用“+”号可以连接两个文本...

23270

扫码关注云+社区

领取腾讯云代金券