深拷贝、浅拷贝、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拷贝一份可变对象,不管拷贝源是何种对象,这次拷贝都是为深拷贝。

上一篇下一篇

猜你喜欢

热点阅读