浅拷贝就是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存。举例如下:
当前类为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,分别指代强引用和弱引用。