Objective C浅拷贝和深拷贝
##浅拷贝 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。如:
char* str = (char*)malloc(100);
char* str2 = str;
复制代码
浅拷贝只是对对象的简单拷贝,让几个对象共用一片内存,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针。
###iOS 里面的浅拷贝 在 iOS 里面, 使用retain
关键字进行引用计数,就是一种更加保险的浅拷贝。他既让几个指针共用同一片内存空间,又可以在release 由于计数的存在,不会轻易的销毁内存,达到更加简单使用的目的。
##深拷贝 深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。
###copy
与 retain
的区别: copy
是创建一个新对象,retain
是创建一个指针,引用对象计数加一。 copy
属性标识两个对象内容相同,新的对象retain count为1, 与旧有对象引用计数无关,旧有对象没有变化。copy
减少对象对上下文的依赖。
###深拷贝 iOS提供了copy
和mutableCopy
方法,顾名思义,copy
就是复制了一个imutable的对象,而mutableCopy
就是复制了一个mutable的对象。以下将举几个例子来说明。 这里指的是NSString
, NSNumber
等等一类的对象。
NSString *string = @”dddd";
NSString *stringCopy = [string copy];
NSMutableString *stringDCopy = [string mutableCopy];
[stringMCopy appendString:@"!!"];
复制代码
查看内存可以发现,string
和stringCopy
指向的是同一块内存区域(weak reference),引用计数没有发生改变。而stringMCopy
则是我们所说的真正意义上的复制,系统为其分配了新内存,是两个独立的字符串内容是一样的。
##拷贝构造 当然在 ios 中并不是所有的对象都支持copy
,mutableCopy
,遵守NSCopying
协议的类可以发送copy
消息,遵守NSMutableCopying
协议的类才可以发送mutableCopy
消息。
假如发送了一个没有遵守上诉两协议而发送copy
或者 mutableCopy
,那么就会发生异常。但是默认的ios类并没有遵守这两个协议。如果想自定义一下copy
那么就必须遵守NSCopying
,并且实现 copyWithZone:
方法,如果想自定义一下mutableCopy
那么就必须遵守NSMutableCopying
,并且实现 mutableCopyWithZone:
方法。
###拷贝构造 如果是我们定义的对象,那么我们自己要实现NSCopying
, NSMutableCopying
这样就能调用copy
和mutablecopy
了。举个例子:
@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浅拷贝和深拷贝相关推荐
- Java中的浅拷贝与深拷贝
一.引用拷贝与对象拷贝 class Person implements Cloneable{private String name;private int age;...省略get和set方法 pro ...
- js之浅拷贝和深拷贝
js数据类型主要分基本数据类型和引用数据类型.前者包括Number,String等,后者主要是Object,因此以下会针对不同的数据类型来分析,需要的朋友可以参考一下 1.js内存 js内存,或者说大 ...
- 43 JavaScript中的浅拷贝与深拷贝
技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.浅拷贝与深拷贝 浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用. 深拷贝拷贝多层,每 ...
- 【进阶4-1期】详细解析赋值、浅拷贝和深拷贝的区别
一.赋值(Copy) 赋值是将某一数值或对象赋给某个变量的过程,分为下面 2 部分 基本数据类型:赋值,赋值之后两个变量互不影响 引用数据类型:赋址,两个变量具有相同的引用,指向同一个对象,相互之间有 ...
- C# 之String以及浅拷贝与深拷贝
C# 之String以及浅拷贝与深拷贝 一.String到底是值类型还是引用类型 MSDN 中明确指出 String 是引用类型而不是值类型,但 String 表面上用起来却像是值类型,这又是什么原 ...
- C# 浅拷贝与深拷贝区别 解惑篇
问题起源: 昨天被同事问到一个浅拷贝与深拷贝区别的问题,说实在的,记得在学校时在书在看过相关概念区别. 只是,那时的在校生,又有几个能对书本上那写的尽量让鬼都看不懂知识能清晰的理解呢. 工作后虽然也有 ...
- clone是深拷贝还是浅拷贝_Cloneable接口的作用与探索理解浅拷贝与深拷贝
导读:本文将主要讨论设计模式--原型模式中,关于cloneable接口及浅拷贝与深拷贝的概念. 原型模式的理解 关于原型模式的理解,我在网上发现一个有趣且助于理解原型模式的例子在这里分享一下:火影忍者 ...
- Java的浅拷贝与深拷贝总结
Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...
- 说说JS中的浅拷贝与深拷贝
outline: 为什么要说JS中深拷贝与浅拷贝 JS对类型的分类 immutable与mutable 简单类型检测 浅拷贝VS深拷贝 为什么要说JS中深拷贝与浅拷贝 近来在研读underscore的 ...
最新文章
- OpenAI推新程序包:GPU适应十倍大模型仅需增加20%训练时间
- 我是如何在阿里巴巴面试中壮烈牺牲的?(内含面试题)
- 种草之火,何以燎原?
- 复习之 c实现 通讯录
- 解决ora-12514 问题
- mysql中存储日期的类型_选择合适的 MySQL 日期时间类型来存储你的时间
- linux 长连接个数限制
- 华为鸿蒙系统学习笔记2-生态系统介绍
- 实习日志_实习律师实习日志第十八篇(连载30篇)
- android 多个模块,Android Studio:多个模块的多个APK
- Apache2 httpd.conf中文版
- python之函数用法__getitem__()
- 初窥JQuery-Jquery简介
- Centos6.7下安装python连接mysql环境故障解决
- 蓝桥杯的c语言编译器,第九届蓝桥杯大赛个人赛省赛(软件类)C/C++ 大学B组比赛心得(还在更新)...
- 华为手机 运行 linux,Linux 用户玩转华为手机之华为分享
- 哈达玛矩阵的相关基础知识
- 计算机教师个人诊改总结,教师个人诊改报告
- 4.16-4.18 transition-group动画(卡片排序),忍让,谦逊,前进。
- macbook系统和linux区别,Mac OS和Linux有什么区别?