初探 copy mutableCopy 1
来源:互联网 发布:linux 系统性能优化 编辑:程序博客网 时间:2024/04/29 22:15
copy:得到被拷贝对象的一个不可变类型的拷贝。
mutableCopy:得到被拷贝对象的一个可变类型的拷贝。
先看段代码:
NSLog(@"********************************************"); NSLog(@" ****** NSArray ******"); id array0 ; id array1 ; NSArray *array = [NSArray arrayWithObjects:@"xiao",nil]; array0 = [array copy]; array1 = [array mutableCopy]; NSLog(@"NSArray %p",array); NSLog(@"copy %p - %@",array0,[array0 class]); NSLog(@"mutableCopy %p - %@",array1,[array1 class]); NSLog(@"********************************************"); NSLog(@" ****** NSMutableArray ******"); id marray0 ; id marray1 ; NSMutableArray *marray = [NSMutableArray array]; [marray addObject:@"zhangsan"]; marray0 = [marray copy]; marray1 = [marray mutableCopy]; NSLog(@"NSMutableArray %p",marray); NSLog(@"copy %p - %@",marray0,[marray0 class]); NSLog(@"mutableCopy %p - %@",marray1,[marray1 class]); NSLog(@"********************************************"); NSLog(@" ****** NSString ******"); NSString *string = @"text"; NSString *copyString = [string copy]; NSString *mutableCopyString = [string mutableCopy]; NSLog(@"string %p",string); NSLog(@"copyString %p",copyString); NSLog(@"mutableCopy %p",mutableCopyString); NSLog(@"********************************************"); NSLog(@" ****** 自定义类 ******"); Patient *zhangSan = [[Patient alloc] init]; [zhangSan setName:@"zhangSan"]; id patient0 = zhangSan ; id patient1 = [zhangSan copy]; id patient2 = [zhangSan mutableCopy]; NSLog(@"Patient %p",zhangSan); NSLog(@"= %p",patient0); NSLog(@"copy %p",patient1); NSLog(@"mutableCopy %p",patient2); NSLog(@"********************************************"); NSLog(@"自定义类的copy/mutableCopy 取决与 copyWithZone:/mutableCopyWithZone: 如何覆写");
@implementation Patient-(instancetype)initWithName:(NSString *)name{ self = [super init]; if (self) { _name = name ; } return self ;}-(id)copyWithZone:(NSZone *)zone{ return self ; //return [[[self class] allocWithZone:zone] initWithName:_name];}-(id)mutableCopyWithZone:(NSZone *)zone{ return [[[self class] allocWithZone:zone] initWithName:_name];}-(NSString *)description{ return [NSString stringWithFormat:@"Name = %@",_name];}@end
输出为:
在输出中打印了每个变量在内存中的地址,和部分变量的类型。通过打印出来的信息可以得到这样的结论:
- 无论被拷贝对象是可变类型的还是不可变类型的,使用copy会得到一个不可变类型的对象,mutableCopy会得到一个可变类型的对象
- 如果被拷贝对象是不可变类型,对其发送copy:消息,相当于浅拷贝(指针拷贝),即得到的对象和被拷贝对象地址相同,其实是同一个对象。
- 如果被拷贝对象是不可变类型,对其发送mutableCopy:消息,会得到一个内容如被拷贝对象相同的可变类型。因为得到的类型与被拷贝的对象类型不同,所以两者在内村中的地址肯定不同。
- 如果被拷贝对象是可变类型的,对其发送copy:或者mtableCopy:消息相当于深拷贝,即得到一个跟被拷贝对象地址不同的对象,一个新对象。
- 在自己定义的类型中,建议遵循上述原则。
再看一段代码:
NSLog(@"********************************************"); Patient *p01 = [[Patient alloc] initWithName:@"aa"]; Patient *p02 = [[Patient alloc] initWithName:@"bb"]; NSMutableArray *mutableArray = [NSMutableArray array]; [mutableArray addObject:p01]; [mutableArray addObject:p02]; Patient *receivePatient = [mutableArray objectAtIndex:0]; [receivePatient setName:@"Changed"]; NSLog(@"%@",[mutableArray objectAtIndex:0]); NSLog(@"mutable %p",[mutableArray objectAtIndex:0]); [mutableArray removeObjectAtIndex:0]; NSLog(@"p01 %p",p01); NSLog(@"receive %p",receivePatient); NSLog(@"********************************************"); Patient *p1 = [[Patient alloc] initWithName:@"a"]; Patient *p2 = [[Patient alloc] initWithName:@"b"]; NSArray *iarray = [NSArray arrayWithObjects:p1,p2,nil]; Patient *tmpPatient = [iarray objectAtIndex:0]; [tmpPatient setName:@"Changed"]; NSLog(@"%@",[iarray objectAtIndex:0]); NSLog(@"array %p",[iarray objectAtIndex:0]); iarray = nil ; NSLog(@"p1 %p",p1); NSLog(@"tmp %p",tmpPatient); NSLog(@"********************************************"); NSLog(@"无论从可变数组还是从不可变数组取对象,都是取得了数组中对象的指针,但是该对象retain+1。"); NSLog(@"[[iarray objectAtIndex:0]mutableCopy] / [[iarray objectAtIndex:0]copy] / [[mutableArray objectAtIndex:0]mutableCopy] / [[mutableArray objectAtIndex:0]copy] 会是什么样的结果呢?”);
输出为:
从输出可以看出:
- 无论是在可变数组中还是不可变数组中增加对象,加入到数组中的都是指向该对象的指针(改变任一对象的name属性值后,所有对象的属性值都发生改变了)。
- 被加入到数组的对象 retain count +1(对一个对象release一次,其他对象没有被释放掉)。
- 接收数组中某个对象一次,就对该对象retain count +1 。
- id obj = [Objects objectAtIndex:i]; <=> id obj = Object ; 指针赋值
0 0
- 初探 copy mutableCopy 1
- copy 、mutableCopy
- Copy & MutableCopy
- copy mutableCopy
- copy && mutableCopy
- mutableCopy与COPY区别
- Copy and MutableCopy
- 对象的copy&mutableCopy
- copy和mutableCopy
- 对象的copy&mutableCopy
- iphone copy 和mutablecopy
- copy、mutableCopy详解
- copy、mutableCopy详解
- copy和mutablecopy浅见
- copy,mutableCopy 理解
- copy和mutablecopy
- MutableCopy 与 Copy
- copy与mutableCopy-----笔记
- 错误:找不到或无法加载主类
- 如何搭建千万级别用户的应用系统
- Smali--Dalvik虚拟机指令语言-->【android_smali语法学习一】
- elasticsearch中的mapping简介
- 仿微信朋友圈回复弹软
- 初探 copy mutableCopy 1
- android基础--tools:context=".MainActivity"作用
- Qt5.4.2编译QtCharts 2.1
- JAVA中对类进行序列化Serializable
- iOS开发中常用的几个苹果网站
- Android中的同步与Mutex
- 移植opencv3.1.0到hi3516a
- Android - ADB调试桥
- android canvas Rotate 图片中心旋转