OC中的copy

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 NSCopying
3 -(id)copyWithZone:(NSZone *)zone;
4 @end
5
6 nutableCopy:需要遵守NSMutableCopying协议,实现mutableCopeWithZone:方法
7 @protocol NSMutableCopying
8 -(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,一端用weak
11     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;
时间: 2024-08-29 08:41:02

OC中的copy的相关文章

黑马程序员------oc中的copy

oc中的copy分为深copy和浅copy 深copy的意思是copy后又重新开辟一个内存空间,对copy的资源进行操作,不会影响本来的那份资源.表格中显示哪些为深copy copy前的可变性 可变 不可变 进行copy 不可变 不可变 进行mutablecopy 可变 可变 以上四中情况下,除了开始是不可变,进行copy后,还是不可变的,这种情况下是浅copy外,其他的三种情况都是深copy. 进行copy操作的,除了系统的NSArray/NSMuabltArray.NSDictionary/

OC 中 的copy 功能 深复制 和 浅复制 的 区别

系统的类要是实现copy拷贝的功能,必须先签订拷贝NSCopying的协议,然后实现对应的方法 在.h文件中得@interface Boy : NSObject 的后面需要签订拷贝NSCopying的协议 例子: 在.h文件中 @interface Boy : NSObject<NSCopying> 1. Boy类使用copy的方法 例子: Boy *boy =[Boy boyWithName:@"zhangyangyang" hobby:@"wan"]

OC中NSFileManager类 和 copy一些用法

一:NSFileManager的使用 1, 概念:用来管理文件系统,它可以用来进行常见的文件\文件夹的操作(拷贝.剪切.创建等) NSFileManager 使用了单例模式singleton 使用defaultManager方法可以获取那个单例对象 2, 1>常见判断 //1,判断文件或文件夹是否存放 // NSFileManager *fileManager = [NSFileManager defaultManager]; // NSString *path = @"/Users/ll

关于OC中得内存管理问题,alloc,retain,release,copy,dealloc

我们都知道,一个手机,它的内存是有限的,而每一个手机应用都是需要一定空间,当应用所占空间过大时,系统就会发出警告,怎样在有限的空间中,做到更高效实用美观的效果呢? 这时候就牵涉到OC中得内存管理了. 在OC这门语言中,是不存在垃圾回收机制的,但是它采用了另外一种形式或者说方法,实现这一个空间回收的效果,那就是引用计数器. 别看-引用计数器,这个名字很高大上,实际是它就是一个整数. 所以OC中分配4个字节才存储它. 引用计数的值只有两种:0和非0,我们知道,计算机其实是很笨的,结果只有这两种时,它

OC中NSString和block的属性时copy,而不用retain

OC中NSString和block的属性时copy,而不用retain   而容器类使用retain NSString 为什么要使用copy,而不是retain 1.首先如果使用retain,只是引用计数+1,并没有生成新的对象,所以效率好 2.但是使用copy安全.因为NSString为NSMutableString 的基类,如果将NSMutableString 以retain的形式赋值给NSString后,后续修改NSMutableString会导致NSString内容的变化,这通常不是我们

OC中的类簇的使用和初始化方法中属性的使用

今天遇到了几个和字符串相关的内存问题,和大家分享一下 NSString *name = [[NSString alloc]initWithString:@"张三"];NSLog(@"%d",[name retainCount]); 这两行代码的打印结果是-1, NSString * aString = [[NSString alloc] initWithFormat:@"123"]; NSLog(@"%d",aString.r

OC中的属性特征

在刚开始学习oc的过程中,一直对声明完返回值后的属性特征不咋明白啥意思,今天特地找了一下资料,彻底的明白其中的意思. oc中的属性特征主要有assign,copy,retain这三个主要的,还有readonly,readwrite.   另外,atomic和nonatomic:以及strong,weak. assign主要是针对基础类型数据和c数据类型的简单赋值,而且它不调用索引计数器(retain count). retain主要是指调用oc中的对象,对oc中的对象进行赋值(主要针对NSObj

oc中深拷贝与浅拷贝

shallow 浅拷贝       Deep深拷贝 1.产生一个新对象,对象的内容与源对象相同 2.源对象与新对象使用不同的内存区域 3.需要NSCopying 或者NSMutableCopying协议才能使用复制功能 ? 4.Fundation中得基础数据类型如Nsstring.NSNumber 等都实现了NSCopying 5.新对象的引用计数为1 6.copy与mutableCopy的区别 copy返回不可变对象(包括可变对象在内) ? mutableCopy返回可变对象 7.浅拷贝只复制

OC中协议, 类目, 时间, 延展, 属性

必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @property (nonatomic, assign) id<marryprotocol> husband; 避免Optitonal没有实现的功能 if ([_husband respondsToSelector:@selector(driver)]) { [_husband driver]; } @required//必须实现的协议, 默认协议 - (void)s