iOS深浅拷贝

2018-05-04  本文已影响64人  sky_fighting

浅拷贝:复制一个指针,仍然指向已经存在的内存
深拷贝:复制一个指针,并新申请一个内存


浅拷贝图解 深拷贝图解

关于拷贝的引用计数:
浅拷贝:a、不可变类型,引用计数+1;b、可变类型,引用计数不变。
深拷贝:可变类型、不可变类型,引用计数都不变

//不可变类型copy
 NSArray *array = [[NSArray alloc] initWithObjects:@"123", nil];
 NSLog(@"开始值: %ld  地址:%p", [array retainCount],array);
    
 NSArray *copyArray = [array copy]; //浅拷贝
 NSLog(@"copy后: %ld   地址:%p", [array retainCount],copyArray);
    
 NSMutableArray *mutableCopyArray = [array mutableCopy]; //深拷贝
 NSLog(@"mutableCopy后: %ld   地址:%p", [array retainCount],mutableCopyArray);

结果:
2018-05-04 16:16:56.354587+0800 ReviewIOS[3203:465659] 开始值: 1  地址:0x604000014850
2018-05-04 16:16:56.354761+0800 ReviewIOS[3203:465659] copy后: 2   地址:0x604000014850
2018-05-04 16:16:56.354883+0800 ReviewIOS[3203:465659] mutableCopy后: 2   地址:0x604000247500

//可变类型copy
  NSMutableArray *array = [[NSMutableArray alloc] init];
  [array addObject:@"123"];
  NSLog(@"开始值: %ld  地址:%p", [array retainCount],array);
    
  NSArray *copyArray = [array copy]; //深拷贝
  NSLog(@"copy后: %ld   地址:%p", [array retainCount],copyArray);
    
  NSMutableArray *mutableCopyArray = [array mutableCopy]; //深拷贝
  NSLog(@"mutableCopy后: %ld   地址:%p", [array retainCount],mutableCopyArray);

结果:
2018-05-04 16:18:44.204876+0800 ReviewIOS[3230:468629] 开始值: 1  地址:0x6000004403f0
2018-05-04 16:18:44.205011+0800 ReviewIOS[3230:468629] copy后: 1   地址:0x60400000b770
2018-05-04 16:18:44.205153+0800 ReviewIOS[3230:468629] mutableCopy后: 1   地址:0x600000440450
关于什么情况下是深拷贝,什么情况下又是浅拷贝呢?如下图所示: 图解

总结如下:
对于不可变对象,copy为浅拷贝,mutableCopy为深拷贝;
对于可变对象,copy和mutableCopy均为深拷贝;
copy的结果为不可变对象,mutableCopy的结果为可变对象;

上一篇下一篇

猜你喜欢

热点阅读