iOS 深复制与浅复制

简介

  • 浅复制:只改变新对象的指针指向,并未生成新的内存地址,只是将新对象的指针指向要复制对象的内存地址
  • 深复制:改变新对象指针指向,还为对象生成新的内存地址。 深复制又分为单层深复制与完全深复制
    1.单层深复制虽然生成了新的内存地址,但是新的对象中的元素地址还是旧对象元素的地址
    2.完全深复制不仅内存地址是新的,对象里面的元素地址也是新的

代码探索

非集合类对象

copy操作:

 	NSString *str = @"123";
    NSString *copyStr = [str copy];
    NSLog(@"%p ---- %p", str, copyStr);
    
    NSMutableString *mutableStr = [NSMutableString stringWithString:@"123"];
    NSString *copyMutableStr = [mutableStr copy];
    NSLog(@"%p  ----  %p", mutableStr, copyMutableStr);

打印结果:

2019-10-27 00:45:57.085342+0800 iii[17764:606331] 0x1043560a8 ---- 0x1043560a8
2019-10-27 00:45:57.085455+0800 iii[17764:606331] 0x6000037de4c0  ----  0xb44a90872ddcc8d4

可知:

  • NSString类型的string进行copy操作生成的新对象只是指向了旧对象的内存地址,并未产生新的内存地址,即进行了浅复制
  • NSMutableString类型的string进行copy操作产生了新的内存地址,生成NSString类型的对象,即进行了深复制

mutableCopy操作:

NSString *str = @"123";
    NSString *copyStr = [str mutableCopy];
    NSLog(@"%p ---- %p", str, copyStr);
    
    NSMutableString *mutableStr = [NSMutableString stringWithString:@"123"];
    NSString *copyMutableStr = [mutableStr mutableCopy];
    NSLog(@"%p  ----  %p", mutableStr, copyMutableStr);

打印结果:

2019-10-27 00:53:35.014694+0800 iii[17841:609737] 0x105a190a8 ---- 0x600003d97ab0
2019-10-27 00:53:35.014830+0800 iii[17841:609737] 0x600003d97ae0  ----  0x600003d97b10

可知:
无论是NSString还是NSMutableString类型,进行mutableCopy操作都是深复制

集合类对象

copy操作:

	NSArray *array = @[@"aaa", @"bbb"];
    NSArray *copyArray = [array copy];
    NSLog(@"%p   ----    %p", array, copyArray);
    
    NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"aaa", @"bbb", nil];
    NSArray *copyMutableArray = [mutableArray copy];
    NSLog(@"%p   ----    %p", mutableArray, copyMutableArray);

打印结果:

2019-10-27 00:59:58.672244+0800 iii[17941:612750] 0x6000011f4960   ----    0x6000011f4960
2019-10-27 00:59:58.672385+0800 iii[17941:612750] 0x600001f9bc90   ----    0x6000011910c0

可知:
与非集合类对象结果相同:

  • NSArray类型的string进行copy操作生成的新对象只是指向了旧对象的内存地址,并未产生新的内存地址,即进行了浅复制
  • NSMutableArray类型的string进行copy操作产生了新的内存地址,生成NSString类型的对象,即进行了深复制

mutableCopy操作 :

	NSArray *array = @[@"aaa", @"bbb"];
    NSArray *copyArray = [array mutableCopy];
    NSLog(@"%p   ----    %p", array, copyArray);
    
    NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"aaa", @"bbb", nil];
    NSArray *copyMutableArray = [mutableArray mutableCopy];
    NSLog(@"%p   ----    %p", mutableArray, copyMutableArray);

打印结果:

2019-10-27 01:02:48.055444+0800 iii[17970:614232] 0x600000bbcda0   ----    0x6000005c8840
2019-10-27 01:02:48.055563+0800 iii[17970:614232] 0x6000005c8450   ----    0x6000005c8c00

与非集合类对象结果相同:
无论是NSArray还是NSMutableArray类型,进行mutableCopy操作都是深复制

单层深复制

打印数组中元素地址:

	NSArray *array = @[@"111", @"222"];
    NSArray *copyArray = [array mutableCopy];
    NSLog(@"%p   ----    %p", array[0], copyArray[0]);
    
    NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"aaa", @"bbb", nil];
    NSArray *copyMutableArray = [mutableArray mutableCopy];
    NSLog(@"%p   ----    %p", mutableArray[0], copyMutableArray[0]);

打印结果:

2019-10-27 01:08:17.634645+0800 iii[18027:616895] 0x103ddc0b8   ----    0x103ddc0b8
2019-10-27 01:08:17.634780+0800 iii[18027:616895] 0x103ddc118   ----    0x103ddc118

可知
元素的地址并没有发生变化,即为单层深复制

完全深复制

要实现元素地址的改变,即完全深复制,可使用协议或归档解档实现,写这篇文章时还没有了解到,现在补上博客:
完全深复制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值