深拷贝和浅拷贝的几个实例

浅拷贝就是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存。举例如下:
当前类为CLHistoryViewCon.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    CLSearchViewCon *searchView = [[CLSearchViewCon alloc] init];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:cache[indexPath.row]];
   searchView.rowData = dict;
   [self.navigationController pushViewController:searchView animated:NO];
}

下面是CLSearchViewCon.h有关rowData的定义

@interface CLSearchViewCon : CLBaseViewCon 
@property (nonatomic,strong) NSDictionary *rowData;
@end

打印dict与指针:

 NSLog(@"his_dict:%p",dict);
 NSLog(@"his_self.rowData:%p",searchView.rowData);

打印结果为:

 his_dict:0x17bde750
 his_self.rowData:0x17bde750

由此可知,二者指向的是同一块内存地址。此为浅拷贝
另外一种形式:

NSDictionary *favData = [NSDictionary   dictionaryWithDictionary:self.rowData];
NSLog(@"seg_self.rowData:%p",self.rowData);
favData = self.rowData;
NSLog(@"测试浅拷贝_self.rowData:%p",favData);
NSDictionary *ceshiData;
ceshiData = self.rowData;
NSLog(@"测试浅拷贝_self.rowData:%p",ceshiData);

打印结果为:

seg_self.rowData:0x17bde750
测试浅拷贝_self.rowData:0x17bde750
测试浅拷贝_self.rowData:0x17bde750

同样是指向同一块内存区域,因此此二种情况仍旧是浅拷贝

然后换成如下方式:

NSDictionary *favData = [[NSDictionary alloc]init];NSLog(@"seg_self.rowData:%p",self.rowData);
favData = self.rowData.copy;
NSLog(@"测试深拷贝_self.rowData:%p",favData);
NSDictionary *ceshiData;
ceshiData = self.rowData.copy;
NSLog(@"测试浅拷贝_self.rowData:%p",ceshiData);

打印结果如下:

seg_self.rowData:0x178d0f50
测试深拷贝_self.rowData:0x4a841970
测试浅拷贝_self.rowData:0x167ea140

不一样的内存地址,由此证明,此为深拷贝,新指针所指向的值改变后并不影响原来的值。

总结:
其实我们判断深拷贝还是浅拷贝还是要根据究竟是简单的指针拷贝(浅拷贝)还是内存的拷贝(深拷贝),而非具不具有copy、mutableCopy等关键词。对于objective-c而言深浅拷贝是由编译器内部处理决定的,并没有什么明确的方法或属性,关键字等指代哪个是深拷贝,哪个是浅拷贝。像c++中会自己写深拷贝的方法。object-c中非常明确的关键词指代都是引用,如strong和weak,分别指代强引用和弱引用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值