OC中的copy
copy的概念
Copy的字面意思是"复制"、"拷贝",是一个产生副本的过程
对象拷贝的目的:要使用某个对象的数据,但是在修改对象的时候不影响原来的对象内容,常见的复制有用一个源文件产生:文件复制
作用:复制一个副本文件
特点:
修改源文件的内容,不会影响副本文件
修改副本文件的内容,不会影响源文件
OC中的copy,就是指的对象的拷贝
作用:利用一个源对象产生一个副本对象 修改源对象的属性和行为,不会影响副本对象
修改副本对象的属性和行为,不会影响源对象
如何使用copy功能
一个对象可以调用copy或mutableCopy方法来创建一个副本对象
copy:创建是不可变副本(如NSString、NSArray、NSDictionary)
mutableCopy:创建的是可变副本(如NSMutableString 、NSMutableArray、NSMutableDictionary)
使用copy功能的前提
copy:需要遵守NSCopying 协议,实现copyWithZone:方法
@protocol NSCopying
-(id)copyWithZone:(NSZone *)zone;
@end nutableCopy:需要遵守NSMutableCopying协议,实现mutableCopeWithZone:方法
@protocol NSMutableCopying
-(id)mutableCopyWithZone:(NSZone *)zone;
@end
copy快速入门
以NSString字符串为例,进行copy 和 mutableCopy演示
copy 就是浅复制,因为没有产生新的对象(有没有产生新的对象也是判断深浅复制的标准)此处的copy后产生还是不可变的字符串
mutableCopy 就是深复制,会产生新的对象,这种copy就是浅复制(浅拷贝)
copy的内存管理
深复制(深拷贝,内容拷贝,deep copy)
源对象和副本对象是不同的两个对象
源对象引用计数器不变,副本对象计数器为1(因为是新产生的)
本质是:产生了新的对象 浅复制(浅拷贝,指针拷贝,shallow copy)
源对象和副本对象是同一个对象
源对象(副本对象)引用计数器+,相当于做一次retain操作
本质是:没有产生新的对象
@property中的copy关键字
@property(nonatomic,copy) NSString *name;
@property内存管理策略选择
@property内存管理策略的选择
.非ARC
copy:只用于NSString/block
retain: 除NSString/block以外的OC对象
assing:基本数据类型、枚举、结构体(非OC对象),当两个对象相互引用,一端用retain,一端用assign .ARC
copy:只用于NSString/block
strong:除NSString/block以外的OC对象
weak:当2个对象相互引用,一端用strong,一端用weak
assgin:基本数据类型、枚举、结构体(非OC对象)
为自定义的类实现copy操作
自定义对象copy步骤
新建Person类
为Person类实现copy操作
.让Person类遵守NSCopying协议
.实现copyWithZone:方法,在该方法中返回一个对象的副本即可
.在copyWithZone方法中,创建一个新的对象,并设置该对象的数据与现有对象一致,并返回该对象
创建Person对象,调用copy方法,查看地址.测试拷贝代码,见备注 细节介绍:
.调用copy其实就是调用copyWithZone方法,所以要实现copyWithZone方法(查看NSObject协议中的copy方法的介绍)
.copyWithZone方法返回值类型是id类型,需要返回一个对象的副本
.关于copyWithZone的参数zone问题:
zone:表示空间,分配对象是需要内存空间的,如果制定了zone,就可以指定新建对象对应的内存空间,但是:zone是一个非常古老的技术,为了避免在堆中出现内存碎片而使用的,在今天的开发中,zone几乎可以忽略
查看NSObject协议中的allocWithZone:方法介绍(zone参数可以被忽略,是历史原因)
.如果对象没有 可变/不可变 的区别,只要实现copyWithZone方法即可
.copyWithZone:方法的具体实现
-(id) copyWithZone:(NSZone *)zone{
//copy 是要建立一个新的副本,和当前的对象具有相同的内容
}
//1.实例化person对象
Person *p =[[Person alloc]init];
p.name =self.name;
p.age =self.age;
return p;
OC中的copy的更多相关文章
- OC中@property属性关键字的使用(assign/weak/strong/copy)
OC中@property属性关键字的使用(assign/weak/strong/copy) 一.assign 用于 ‘基本数据类型’.‘枚举’.‘结构体’ 等非OC对象类型 eg:int.bool等 ...
- Swift: 比较Swift中闭包传值、OC中的Block传值
一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...
- OC中的内存管理
一. 基本原理 1. 什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需 ...
- OC中两种单例实现方式
OC中两种单例实现方式 写在前面 前两天探索了一下C++ 的单例,领悟深刻了许多.今天来看看OC中的单例又是怎么回事.查看相关资料,发现在OC中一般有两种实现单例的方式,一种方式是跟C++ 中类似的常 ...
- 如何在swift中实现oc中的分类
在oc中为了增强已有类的功能,我们经常使用分类.使用分类,我们可以在不破坏原有类的结构的前提下,对原有类进行模块化的扩展. 但是在swift中没有分类这种写法了.相对应的是swift中只有扩展(Ext ...
- OC中最难的一部分内容:内存管理
OC中最难的一部分内容:内存管理为什么说他难呢?因为内存如果需要我们程序员去管理的话,那个难度肯定是很大的,如果是Java,垃圾回收器会把这份工作给做了,我们不需要关心,但是就是因为如此,Androi ...
- OC中对象拷贝概念
OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语言有不同的解决方式:C++中有拷贝构造函数,Java中需要实现Cloneable接口,在clone方法中进行操作.但是不过OC ...
- OC中两个关键字的作用:@property和@synthesize
两个关键字的使用:@property和@synthesize 一.@property关键字这个关键字是OC中能够快速的定义一个属性的方式,而且他可以设置一些值,就可以达到一定的效果,比如引用计数的问题 ...
- iOS中的copy
原文:http://www.jianshu.com/p/5254f1277dba 内存的栈区 : 由编译器自动分配释放, 存放函数的参数值, 局部变量的值等. 其操作方式类似于数据结构中的栈. 内存的 ...
随机推荐
- mybatis的学习笔记
前几天学习了mybatis,今天来复习一下它的内容. mybatis是一个基于Java的持久层框架,那就涉及到数据库的操作.首先来提出第一个问题:java有jdbc连接数据库,我们为什么还要使用框架呢 ...
- flex中日期的格式化
今天我做的项目中需要把时间给拆分了,形式为:yyyy-MM-DD HH mm, 下面是我的代码实现: <?xml version="1.0" encoding="u ...
- Centos6.8 安装 nginx
rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm ...
- 对Golang有兴趣的朋友,推荐一款go语言Web框架-dotweb
Go语言,2009年推出,对我个人,2015年下半年,才下定决心正式开始引入使用Go,自此,让我获得了一种全新的开发体验. 在不断的项目过程中,一个开发人员总喜欢堆积一些代码段,由于Go的开源特性,逐 ...
- Java核心编程快速学习
Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体内容如下图所示. 反射reflect是理解Java语言工作原理的基础,Java编译器首先需要将我们编写的 ...
- freemarker导出word文档——WordXML格式解析
前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...
- mysql 主从同步 实现增量备份
数据库复制 replication 的实现原理 1:主服务器凡运行语句,都产生一个二进制日志 binlog 2:从服务器不断读取主服务器的binlog 3:从主服务读取到的binlog,转换为自身可执 ...
- Windows入门基础:2.vs2013中Icon显示
第一:系统小图标的显示 wndclass.hIcon = LoadIcon(NULL,IDI_WARNING); //LoadIcon函数的第一的参数要为0,第二个参数是系统自定义的ID号: IDI_ ...
- Java线程池使用和分析(二) - execute()原理
相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的 ...
- Android -- 从源码带你从EventBus2.0飚到EventBus3.0(一)
1,最近看了不少的面试题,不管是百度.网易.阿里的面试题,都会问到EventBus源码和RxJava源码,而自己只是在项目中使用过,却没有去用心的了解它底层是怎么实现的,所以今天就和大家一起来学习学习 ...