博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC中的copy
阅读量:7309 次
发布时间:2019-06-30

本文共 2426 字,大约阅读时间需要 8 分钟。

copy的概念

1     Copy的字面意思是"复制"、"拷贝",是一个产生副本的过程2     对象拷贝的目的:要使用某个对象的数据,但是在修改对象的时候不影响原来的对象内容,常见的复制有用一个源文件产生:文件复制3 作用:复制一个副本文件

特点:

1 修改源文件的内容,不会影响副本文件2 修改副本文件的内容,不会影响源文件3 OC中的copy,就是指的对象的拷贝4 作用:利用一个源对象产生一个副本对象5 6 修改源对象的属性和行为,不会影响副本对象7 修改副本对象的属性和行为,不会影响源对象

如何使用copy功能

1 一个对象可以调用copy或mutableCopy方法来创建一个副本对象2 copy:创建是不可变副本(如NSString、NSArray、NSDictionary)3 mutableCopy:创建的是可变副本(如NSMutableString 、NSMutableArray、NSMutableDictionary)

使用copy功能的前提

1 copy:需要遵守NSCopying 协议,实现copyWithZone:方法2 @protocol NSCopying3 -(id)copyWithZone:(NSZone *)zone;4 @end5 6 nutableCopy:需要遵守NSMutableCopying协议,实现mutableCopeWithZone:方法7 @protocol NSMutableCopying8 -(id)mutableCopyWithZone:(NSZone *)zone;9 @end

copy快速入门

1     以NSString字符串为例,进行copy 和 mutableCopy演示2     copy 就是浅复制,因为没有产生新的对象(有没有产生新的对象也是判断深浅复制的标准)此处的copy后产生还是不可变的字符串3     mutableCopy 就是深复制,会产生新的对象,这种copy就是浅复制(浅拷贝)4 5

copy的内存管理

1 深复制(深拷贝,内容拷贝,deep copy)2 源对象和副本对象是不同的两个对象3 源对象引用计数器不变,副本对象计数器为1(因为是新产生的)4 本质是:产生了新的对象5 6 浅复制(浅拷贝,指针拷贝,shallow copy)7 源对象和副本对象是同一个对象8 源对象(副本对象)引用计数器+1,相当于做一次retain操作9 本质是:没有产生新的对象

@property中的copy关键字

1 @property(nonatomic,copy) NSString *name;

@property内存管理策略选择

1 @property内存管理策略的选择 2 1.非ARC 3     copy:只用于NSString/block 4     retain: 除NSString/block以外的OC对象 5     assing:基本数据类型、枚举、结构体(非OC对象),当两个对象相互引用,一端用retain,一端用assign 6  7 2.ARC 8     copy:只用于NSString/block 9     strong:除NSString/block以外的OC对象10     weak:当2个对象相互引用,一端用strong,一端用weak11     assgin:基本数据类型、枚举、结构体(非OC对象)

为自定义的类实现copy操作

1 自定义对象copy步骤 2     新建Person类 3     为Person类实现copy操作 4         1.让Person类遵守NSCopying协议 5         2.实现copyWithZone:方法,在该方法中返回一个对象的副本即可 6         3.在copyWithZone方法中,创建一个新的对象,并设置该对象的数据与现有对象一致,并返回该对象 7     创建Person对象,调用copy方法,查看地址.测试拷贝代码,见备注 8  9 细节介绍:10     1.调用copy其实就是调用copyWithZone方法,所以要实现copyWithZone方法(查看NSObject协议中的copy方法的介绍)11     2.copyWithZone方法返回值类型是id类型,需要返回一个对象的副本12     3.关于copyWithZone的参数zone问题:13             zone:表示空间,分配对象是需要内存空间的,如果制定了zone,就可以指定新建对象对应的内存空间,但是:zone是一个非常古老的技术,为了避免在堆中出现内存碎片而使用的,在今天的开发中,zone几乎可以忽略14             查看NSObject协议中的allocWithZone:方法介绍(zone参数可以被忽略,是历史原因)15     4.如果对象没有 可变/不可变 的区别,只要实现copyWithZone方法即可16     5.copyWithZone:方法的具体实现17         -(id) copyWithZone:(NSZone *)zone{18               //copy 是要建立一个新的副本,和当前的对象具有相同的内容19         }    20         //1.实例化person对象21         Person *p =[[Person alloc]init];22         p.name =self.name;23         p.age =self.age;24         return p;

 

转载于:https://www.cnblogs.com/developer-wang/p/4512209.html

你可能感兴趣的文章
strerror_r
查看>>
java多线程编程总结
查看>>
Cygwin下调用gvim乱码
查看>>
Grub
查看>>
MyBatis Generator
查看>>
shell脚本中格式化日期
查看>>
云计算学习之路——VSphere的介绍
查看>>
Python面向对象学习笔记
查看>>
我的友情链接
查看>>
Zabbix教程-Zabbix配置文件详解
查看>>
系统扩充
查看>>
我的友情链接
查看>>
【转】linux ar命令的说明
查看>>
最近有点烦
查看>>
我的友情链接
查看>>
SAP学习的精华
查看>>
中国电信网络安全团队提醒:家庭宽带路由安全使用建议
查看>>
创建SqliteDatabase
查看>>
mac os x设置环境变量
查看>>
CentOS安装setup配置工具
查看>>