深拷贝、浅拷贝、mutableCopy、copy
2018-11-13 本文已影响167人
球球ol
关于深拷贝、浅拷贝的文章有很多,比如深拷贝拷贝的是对象的指针和内存地址的内容;浅拷贝拷贝的是对象的指针,简单来说如下图:
QQ20181113-102415@2x.png
那是不是深拷贝==mutableCopy,浅拷贝==copy呢?
NSMutableArray *demo1Arr = [NSMutableArray arrayWithObjects:@(1),@(2), nil];
NSArray *demo2Arr = [demo1Arr copy];
NSLog(@"demo2Arr:%@",[demo2Arr classForCoder]);
NSLog(@"demo1Arr地址 = %p,demo2Arr内存地址 = %p\n demo1Arr指针地址 = %x,demo2Arr内存地址 =
%x",demo1Arr,demo2Arr,&demo1Arr,&demo2Arr);
打印日志:
demo2Arr:NSArray
demo1Arr内存地址 = 0x600000e681b0,
demo2Arr内存地址 = 0x60000002df60
demo1Arr指针地址 = eedf5970,
demo2Arr内存地址 = eedf5968
我们定义了一个demo1Arr为可变数组,对其进行深拷贝(看打印日志,demo2Arr内存地址和demo1内存地址相同)并赋值给demo2Arr,但是demo2Arr的真实数据类型为不可变数组NSArray
NSArray *demo1Arr = [NSArray arrayWithObjects:@(1),@(2), nil];
NSArray *demo2Arr = [demo1Arr copy];
NSLog(@"demo2Arr:%@",[demo2Arr classForCoder]);
NSLog(@"demo1Arr地址 = %p,demo2Arr内存地址 = %p\n demo1Arr指针地址 = %x,demo2Arr内存地址 = %x",demo1Arr,demo2Arr,&demo1Arr,&demo2Arr);
打印日志:
demo2Arr:NSArray
demo1Arr内存地址 = 0x6000009759c0,
demo2Arr内存地址 = 0x6000009759c0
demo1Arr指针地址 = ec203970,
demo2Arr内存地址 = ec203968
我们定义了一个demo1Arr为不可变数组,对其进行浅拷贝(看打印日志,demo2Arr内存地址和demo1内存地址相同)并赋值给demo2Arr,则demo2Arr的真实数据类型为不可变数组NSArray
NSArray *demo1Arr = [NSArray arrayWithObjects:@(1),@(2), nil];
NSArray *demo2Arr = [demo1Arr mutableCopy];
NSLog(@"demo2Arr:%@",[demo2Arr classForCoder]);
NSLog(@"demo1Arr地址 = %p,demo2Arr内存地址 = %p\n demo1Arr指针地址 = %x,demo2Arr内存地址 = %x",demo1Arr,demo2Arr,&demo1Arr,&demo2Arr);
打印日志:
demo2Arr:NSMutableArray
demo1Arr内存地址 = 0x600000d76fe0,
demo2Arr内存地址 = 0x6000003270f0,
demo1Arr指针地址 = e78e0970,
demo2Arr内存地址 = e78e0968
我们定义了一个demo1Arr为不可变数组,对其进行深拷贝(看打印日志,重新创建的数组内存地址和指针地址都是重新创建的)并赋值给demo2Arr,则demo2Arr的真实数据类型为可变数组NSMutableArray
NSMutableArray *demo1Arr = [NSMutableArray arrayWithObjects:@(1),@(2), nil];
NSMutableArray *demo2Arr = [demo1Arr mutableCopy];
NSLog(@"demo2Arr:%@",[demo2Arr classForCoder]);
NSLog(@"demo1Arr内存地址 = %p,demo2Arr内存地址 = %p\n demo1Arr指针地址 = %x,demo2Arr内存地址 = %x",demo1Arr,demo2Arr,&demo1Arr,&demo2Arr);
打印日志:
demo2Arr:NSMutableArray
demo1Arr内存地址 = 0x600001746f70,
demo2Arr内存地址 = 0x600001746d90
demo1Arr指针地址 = e5cad970,
demo2Arr内存地址 = e5cad968
我们定义了一个demo1Arr为可变数组,对其进行深拷贝(看打印日志,重新创建的数组内存地址和指针地址都是重新创建的)并赋值给demo2Arr,则demo2Arr的真实数据类型为变数组NSMutableArray
NSMutableArray *demo1Arr = [NSMutableArray arrayWithObjects:@(1),@(2), nil];
NSMutableArray *demo2Arr = [demo1Arr copy];
NSLog(@"demo2Arr:%@",[demo2Arr classForCoder]);
NSLog(@"demo1Arr内存地址 = %p,demo2Arr内存地址 = %p\n demo1Arr指针地址 = %x,demo2Arr内存地址 = %x",demo1Arr,demo2Arr,&demo1Arr,&demo2Arr);
打印日志:
demo2Arr:NSArray
demo1Arr内存地址 = 0x600000290570,
demo2Arr内存地址 = 0x600000c98040
demo1Arr指针地址 = e5601970,
demo2Arr内存地址 = e5601968
我们定义了一个demo1Arr为可变数组,对其进行深拷贝(看打印日志,重新创建的数组内存地址和指针地址都是重新创建的)并赋值给demo2Arr,则demo2Arr的真实数据类型为不变数组NSArray
所以,总结一下:
copy、mutableCopy和浅拷贝、深拷贝并没有什么关系,copy只是拷贝一份不可变对象,是不是深拷贝,取决于它的拷贝源类型,如果拷贝源是不可变对象,这次拷贝为浅拷贝;如果拷贝源为可变对象,则这次拷贝为深拷贝。mutableCopy拷贝一份可变对象,不管拷贝源是何种对象,这次拷贝都是为深拷贝。