##浅拷贝 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。如:

char* str = (char*)malloc(100);
char* str2 = str;
复制代码

浅拷贝只是对对象的简单拷贝,让几个对象共用一片内存,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针。

###iOS 里面的浅拷贝 在 iOS 里面, 使用retain 关键字进行引用计数,就是一种更加保险的浅拷贝。他既让几个指针共用同一片内存空间,又可以在release 由于计数的存在,不会轻易的销毁内存,达到更加简单使用的目的。

##深拷贝 深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。

###copyretain 的区别: copy 是创建一个新对象,retain 是创建一个指针,引用对象计数加一。 copy属性标识两个对象内容相同,新的对象retain count为1, 与旧有对象引用计数无关,旧有对象没有变化。copy减少对象对上下文的依赖。

###深拷贝 iOS提供了copymutableCopy方法,顾名思义,copy就是复制了一个imutable的对象,而mutableCopy就是复制了一个mutable的对象。以下将举几个例子来说明。 这里指的是NSString, NSNumber等等一类的对象。

NSString *string = @”dddd";
NSString *stringCopy = [string copy];
NSMutableString *stringDCopy = [string mutableCopy];
[stringMCopy appendString:@"!!"];
复制代码

查看内存可以发现,stringstringCopy指向的是同一块内存区域(weak reference),引用计数没有发生改变。而stringMCopy则是我们所说的真正意义上的复制,系统为其分配了新内存,是两个独立的字符串内容是一样的。

##拷贝构造 当然在 ios 中并不是所有的对象都支持copymutableCopy,遵守NSCopying协议的类可以发送copy消息,遵守NSMutableCopying协议的类才可以发送mutableCopy消息。

假如发送了一个没有遵守上诉两协议而发送copy或者 mutableCopy,那么就会发生异常。但是默认的ios类并没有遵守这两个协议。如果想自定义一下copy 那么就必须遵守NSCopying,并且实现 copyWithZone: 方法,如果想自定义一下mutableCopy 那么就必须遵守NSMutableCopying,并且实现 mutableCopyWithZone: 方法。

###拷贝构造 如果是我们定义的对象,那么我们自己要实现NSCopying , NSMutableCopying这样就能调用copymutablecopy了。举个例子:

@interface MyObj : NSObject<NSCopying, NSMutableCopying>{NSMutableString *_name;NSString * _imutableStr ;int _age;
}
@property (nonatomic, retain) NSMutableString *name;
@property (nonatomic, retain) NSString *imutableStr;
@property (nonatomic) int age;
复制代码

拷贝构造:

(id)copyWithZone:(NSZone *)zone{MyObj *copy = [[[self class] allocWithZone :zone] init];copy->name = [_name copy];copy->imutableStr = [_imutableStr copy];copy->age = age;return copy;
}
复制代码

拷贝构造:

- (id)mutableCopyWithZone:(NSZone *)zone{MyObj *copy = NSCopyObject(self, 0, zone);copy->name = [_name mutableCopy];copy->age = age;return copy;
}
复制代码

转载于:https://juejin.im/post/5a684e9651882535a47d07c5

Objective C浅拷贝和深拷贝相关推荐

  1. Java中的浅拷贝与深拷贝

    一.引用拷贝与对象拷贝 class Person implements Cloneable{private String name;private int age;...省略get和set方法 pro ...

  2. js之浅拷贝和深拷贝

    js数据类型主要分基本数据类型和引用数据类型.前者包括Number,String等,后者主要是Object,因此以下会针对不同的数据类型来分析,需要的朋友可以参考一下 1.js内存 js内存,或者说大 ...

  3. 43 JavaScript中的浅拷贝与深拷贝

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.浅拷贝与深拷贝 浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用. 深拷贝拷贝多层,每 ...

  4. 【进阶4-1期】详细解析赋值、浅拷贝和深拷贝的区别

    一.赋值(Copy) 赋值是将某一数值或对象赋给某个变量的过程,分为下面 2 部分 基本数据类型:赋值,赋值之后两个变量互不影响 引用数据类型:赋址,两个变量具有相同的引用,指向同一个对象,相互之间有 ...

  5. C# 之String以及浅拷贝与深拷贝

    C# 之String以及浅拷贝与深拷贝  一.String到底是值类型还是引用类型 MSDN 中明确指出 String 是引用类型而不是值类型,但 String 表面上用起来却像是值类型,这又是什么原 ...

  6. C# 浅拷贝与深拷贝区别 解惑篇

    问题起源: 昨天被同事问到一个浅拷贝与深拷贝区别的问题,说实在的,记得在学校时在书在看过相关概念区别. 只是,那时的在校生,又有几个能对书本上那写的尽量让鬼都看不懂知识能清晰的理解呢. 工作后虽然也有 ...

  7. clone是深拷贝还是浅拷贝_Cloneable接口的作用与探索理解浅拷贝与深拷贝

    导读:本文将主要讨论设计模式--原型模式中,关于cloneable接口及浅拷贝与深拷贝的概念. 原型模式的理解 关于原型模式的理解,我在网上发现一个有趣且助于理解原型模式的例子在这里分享一下:火影忍者 ...

  8. Java的浅拷贝与深拷贝总结

    Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...

  9. 说说JS中的浅拷贝与深拷贝

    outline: 为什么要说JS中深拷贝与浅拷贝 JS对类型的分类 immutable与mutable 简单类型检测 浅拷贝VS深拷贝 为什么要说JS中深拷贝与浅拷贝 近来在研读underscore的 ...

最新文章

  1. OpenAI推新程序包:GPU适应十倍大模型仅需增加20%训练时间
  2. 我是如何在阿里巴巴面试中壮烈牺牲的?(内含面试题)
  3. 种草之火,何以燎原?
  4. 复习之 c实现 通讯录
  5. 解决ora-12514 问题
  6. mysql中存储日期的类型_选择合适的 MySQL 日期时间类型来存储你的时间
  7. linux 长连接个数限制
  8. 华为鸿蒙系统学习笔记2-生态系统介绍
  9. 实习日志_实习律师实习日志第十八篇(连载30篇)
  10. android 多个模块,Android Studio:多个模块的多个APK
  11. Apache2 httpd.conf中文版
  12. python之函数用法__getitem__()
  13. 初窥JQuery-Jquery简介
  14. Centos6.7下安装python连接mysql环境故障解决
  15. 蓝桥杯的c语言编译器,第九届蓝桥杯大赛个人赛省赛(软件类)C/C++ 大学B组比赛心得(还在更新)...
  16. 华为手机 运行 linux,Linux 用户玩转华为手机之华为分享
  17. 哈达玛矩阵的相关基础知识
  18. 计算机教师个人诊改总结,教师个人诊改报告
  19. 4.16-4.18 transition-group动画(卡片排序),忍让,谦逊,前进。
  20. macbook系统和linux区别,Mac OS和Linux有什么区别?

热门文章

  1. 深证信息等三方拟联合开展大数据研究
  2. Shell 函数、数组与正则表达式
  3. mysql-5.6 升级 5.7
  4. WYSE Thin Clinet 常用快捷键
  5. Linux shell笔记
  6. iOS 一些基础的方法
  7. ABAP git客户端
  8. ios searchBar 的代理方法 集合
  9. SQLServer学习-- SQLServer
  10. JConsole是什么