美文网首页
iOS 深浅拷贝

iOS 深浅拷贝

作者: 自律_自强_通达 | 来源:发表于2020-10-14 16:48 被阅读0次

iOS深拷贝与浅拷贝的区别

深拷贝与浅拷贝的概念:(我的理解,望不吝赐教)

  • 浅拷贝:只copy一份对象的指针,指向对象的内存地址。
  • 深拷贝:拷贝对象到一块新的内存区域,然后吧新的对象的指针指向这块内存。

iOS中并不是所有对象都支持CopyMutableCopy,遵守NSCopying协议的类可以发送Copy消息,遵循MutableCopying协议的类可以发送MutableCopy消息。若未曾遵守该协议却发送相应消息会发生异常。
遵守NSCopying协议必须实现copyWithZone方法,遵守NSMutableCopying协议必须实现mutableCopyWithzone方法。

可变对象和不可变对象分别调用Copy和MutableCopy方法的区别

  • 非容器类对象

    • 调用copymutableCopy方法
    NSString *originString = @"abc";
    
    NSString *copyStr = [originString copy];
    NSString *mucpStr = [originString mutableCopy];
    
    NSLog(@"origStr : %p, %p",originString, &originString);
    NSLog(@"copyStr : %p, %p",copyStr, &copyStr);
    NSLog(@"mucpStr : %p, %p",mucpStr, &mucpStr);
    NSLog(@"------------------------------------");
    
    NSMutableString *copyMstr = [originString copy];
    //[copyMstr appendString:@"bb"];// 会直接crash
    NSMutableString *mucpMstr = [originString mutableCopy];
    NSLog(@"copyMstr : %p, %p",copyMstr, &copyMstr);
    NSLog(@"mucpMstr : %p, %p",mucpMstr, &mucpMstr);
    NSLog(@"--------mucpMstr--appended--------------------------");
    [mucpMstr appendString:@"cc"];
    NSLog(@"mucpMstr : %p, %p",mucpMstr, &mucpMstr);
    
    // log
    origStr : 0x103bb0020, 0x7ffeec050288
    copyStr : 0x103bb0020, 0x7ffeec050280
    mucpStr : 0x600003626280, 0x7ffeec050278
    ------------------------------------
    copyMstr : 0x103bb0020, 0x7ffeec050270
    mucpMstr : 0x60000360e310, 0x7ffeec050268
    --------mucpMstr--appended-----------
    mucpMstr : 0x60000360e310, 0x7ffeec050268
    
    

    可以得出

    • 对系统非容器类不可变对象进行copy结果只是复制了对象的引用,指向原地址。
    • 对系统非容器类不可变对象进行mutableCopy结果是复制对象到一块新的内存,并把新的对象指针指向新的内存地址。
    • 另外对于可变对象,copy结果是复制对象到一块新的内存,并把新的对象指针指向新的内存地址。copy过后的不可修改,否则crash(可以自行测试,未给出代码)
    • 可变对象,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/yvywpktx.html