首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解

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

作者头像
用户1941540
发布2018-05-11 11:33:07
6270
发布2018-05-11 11:33:07
举报
文章被收录于专栏:ShaoYLShaoYL

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

  基本概念

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

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

  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 的一些常见复制的案例

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-06-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档