ios中存在真正意义上的深拷贝吗??

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dangbai01_/article/details/81736779

pre:

刚发现一个问题,对于数组来说,无论是可变数组还是不可变数组,都不存在完全意义上的深拷贝    

不可变数组直接copy的话相当于赋值,是个引用,地址没变,不可变数组mutableCopy的话是个浅copy,只copy了对象,数组元素地址不变。  

可变数组无论是copy还是mutableCopy,都是只拷贝一个对象,数组元素地址指向原来地址,只有对象地址不一样

有一种说法是:ios中深拷贝本来就是单层深复制

但是真实意义上的深copy应该是对象和对象属性完全复制吧,像python的deepcopy,这点先做区分吧,很神奇的oc

验证:

#import "ViewController.h"

@interface ViewController ()

//不变

扫描二维码关注公众号,回复: 3271262 查看本文章

@property(nonatomic,strong) NSArray *aArr;

@property(nonatomic,strong)NSMutableArray  *mArr;

//测试用

@property(nonatomic,strong) NSArray *bArr;

@property(nonatomic,strong) NSArray *cArr;

@property(nonatomic,strong) NSArray *dArr;

@property(nonatomic,strong) NSMutableArray *eArr;

@property(nonatomic,strong) NSMutableArray *fArr;

@property(nonatomic,strong)NSMutableArray *gArr;

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    

    //不变

    self.aArr = @[@"1",@"2",@[@"1",@"2"]];

    self.mArr =  [NSMutableArray arrayWithObjects:@"1",@"2",@[@"1",@"2"] ,nil];

    

    

    

    /*

     测试

     */

    

    self.bArr = self.aArr;

    NSLog(@"直接赋值验证a:%p",self.aArr);

    NSLog(@"直接赋值验证b:%p",self.bArr);

//    2018-08-16 09:32:16.036105+0800 CopyTest[2027:40242] 0x60000044de60

//    2018-08-16 09:32:16.036255+0800 CopyTest[2027:40242] 0x60000044de60

//    输出地址是一致的,我们可以看这就是一个引用,a is b,b就是a的一个别名

    

    

    

    

    self.cArr = [self.aArr copy];

    NSLog(@"不可变对象的copya:%p",self.aArr);

    NSLog(@"不可变对象的copyc:%p",self.cArr);

//    2018-08-16 09:44:22.559871+0800 CopyTest[2353:51352] 不可变对象的copy:0x6000004599e0

//    2018-08-16 09:44:22.559958+0800 CopyTest[2353:51352] 不可变对象的copy:0x6000004599e0

//    可以看到就是一个引用

    

    

    self.dArr  = [self.aArr mutableCopy];

    NSLog(@"不可变对象的mutableCopya:%p",self.aArr);

    NSLog(@"不可变对象的mutableCopyd:%p",self.dArr);

    NSLog(@"第一层元素的地址a[1]:%p",self.aArr[1]);

    NSLog(@"第一层元素的地址d[1]:%p",self.dArr[1]);

//    2018-08-16 09:47:13.286582+0800 CopyTest[2406:53623] 不可变对象的mutableCopy:0x600000452ae0

//    2018-08-16 09:47:13.286747+0800 CopyTest[2406:53623] 不可变对象的mutableCopy:0x600000452e70

//    2018-08-16 09:50:13.212929+0800 CopyTest[2477:56208] 第一层元素的地址a[1]:0x10c576090

//    2018-08-16 09:50:13.213072+0800 CopyTest[2477:56208] 第一层元素的地址d[1]:0x10c576090

//    可以看到两个对象的地址不一样,这是两个对象,但是里边元素的地址是一样的,我们可以看到只是copy了对象

    

    

    

    self.eArr = [self.mArr copy];

    NSLog(@"可变对象的Copym:%p",self.mArr);

    NSLog(@"可变对象的Copye:%p",self.eArr);

    NSLog(@"第一层元素的地址m[1]:%p",self.mArr[1]);

    NSLog(@"第一层元素的地址e[1]:%p",self.eArr[1]);

//    2018-08-16 09:56:30.750432+0800 CopyTest[2591:60338] 可变对象的mutableCopym:0x604000459530

//    2018-08-16 09:56:30.750533+0800 CopyTest[2591:60338] 可变对象的mutableCopye:0x600000252b40

//    2018-08-16 09:56:30.750634+0800 CopyTest[2591:60338] 第一层元素的地址m[1]:0x1060fc090

//    2018-08-16 09:56:30.750715+0800 CopyTest[2591:60338] 第一层元素的地址e[1]:0x1060fc090

//    可以看到对象的地址不一样,但是元素地址一致,这个是浅copy

    

    

    

    

    self.fArr = [self.mArr mutableCopy];

    NSLog(@"可变对象的mutableCopym:%p",self.mArr);

    NSLog(@"可变对象的mutableCopyf:%p",self.fArr);

    NSLog(@"第一层元素的地址m[1]:%p",self.mArr[1]);

    NSLog(@"第一层元素的地址f[1]:%p",self.fArr[1]);

//    2018-08-16 10:03:31.153672+0800 CopyTest[2749:66217] 可变对象的mutableCopym:0x604000445520

//    2018-08-16 10:03:31.153805+0800 CopyTest[2749:66217] 可变对象的mutableCopyf:0x600000251370

//    2018-08-16 10:03:31.153989+0800 CopyTest[2749:66217] 第一层元素的地址m[1]:0x10e210090

//    2018-08-16 10:03:31.154186+0800 CopyTest[2749:66217] 第一层元素的地址f[1]:0x10e210090

//    可以看到对象的地址不一样,但是元素地址一致,这个是浅copy

//    mutableArray3=[[NSMutableArray alloc]initWithArray:mutableArray2 copyItems:YES]

//    和上边结果一样

    

猜你喜欢

转载自blog.csdn.net/dangbai01_/article/details/81736779