美文网首页
iOS深浅拷贝

iOS深浅拷贝

作者: sky_fighting | 来源:发表于2018-05-04 11:17 被阅读64次

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


浅拷贝图解 深拷贝图解

关于拷贝的引用计数:
浅拷贝: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的结果为可变对象;

相关文章

  • iOS 深浅拷贝

    iOS深浅拷贝

  • iOS深浅拷贝

    授权转载,作者:西木柚子 OC对象的三种拷贝方式 OC的对象拷贝有如下三种方式,很多时候我们把深复制和完全复制混为...

  • iOS深浅拷贝

    简述深浅拷贝 我们实例化的对象存储在堆区,而指向对象的指针一般存储在栈区。我们需要知道这个前提。  实际上拷贝分为...

  • iOS深浅拷贝

    浅拷贝:复制一个指针,仍然指向已经存在的内存深拷贝:复制一个指针,并新申请一个内存 关于拷贝的引用计数:浅拷贝:a...

  • iOS 深浅拷贝

    一、引言 我们都知道,iOS中的对象,遵守NSCopying 协议的类可以发送copy消息,遵守NSMutable...

  • iOS 深浅拷贝

    http://www.cocoachina.com/cms/wap.php?action=article&id=2...

  • iOS深浅拷贝

    (本文根据CocoaChina上的一篇帖子整理,后期附上链接)最开始,我们需要清楚一些关于内存分配方式的基础知识。...

  • iOS深浅拷贝

    引言 在对于自定义的对象支持copy功能,也就是我们要给自定义的对象发送copy message,那我们就要手动实...

  • iOS 深浅拷贝

    深拷贝和浅拷贝的本质区别是地址是否相同。 浅拷贝并没有进行真正的复制,而是复制的对象和原对象都指向同一个地址; 深...

  • iOS 深浅拷贝

    iOS深拷贝与浅拷贝的区别 深拷贝与浅拷贝的概念:(我的理解,望不吝赐教) 浅拷贝:只copy一份对象的指针,指向...

网友评论

      本文标题:iOS深浅拷贝

      本文链接:https://www.haomeiwen.com/subject/ascdrftx.html