美文网首页
copy与 mutablecopy

copy与 mutablecopy

作者: 扬起帆前行 | 来源:发表于2021-07-17 22:26 被阅读0次

    一 、copy 与mutablecopy的区别?

    复制:创建对象的副本;两种结果:复制指向对象的指针与复制整个对象 ;
    针对这两种不同的结果:

    • 复制对象指针的称为浅拷贝;
    • 复制对象全部的称为深拷贝,(在内存中重新开辟一片空间)

    在objective-c中有两种方法可以返回对象的副本:

    • copy :
      实现了NSCopying协议
      func copy(with zone: NSZone? = nil) -> Any { }
      复制的结果是不可变的,无论拷贝源是可变还是不可变;
    • mutableCopy:
      实现了NSMutableCopying 协议
      func mutableCopy(with zone: NSZone? = nil) -> Any { }
      复制的结果是可变的,无论拷贝源是可变还是不可变;

    结论

    两者的区别:

    1. 实现的协议不一样
    2. 结果不一样: copy的结果是不可变的;mutablecopy的结果是可变的;

    二、 列举不同的拷贝源 分别对应不同的copy输出的结果?

    分两种讨论( 坚持的原则就是互不影响的前提下节省内存)

    1. 不可变的拷贝源 例如NSString、NSArray;
    • 调用copy 返回的结果,拷贝一份指向对象的指针 ;返回的结果还是不可变的;
    • 调用mutableCopy 拷贝对象,地址改变;copy的结果可变
            // 案例一 copy 字符串
            let copysourse = NSString("不可变的字符串")
            let copy1 = copysourse.copy()
            let copy2 = copysourse.mutableCopy()
            //0x6000038e1f20-copysourse
            //0x6000038e1f20-copy
            //0x6000038e2160-mutablecopy:
    
           // 案例二 copy 数组
            let v = NSString("a")
            let copysourse = NSArray(array: [v])
            let copy1:NSArray = copysourse.copy() as! NSArray
            let copy2:NSArray = copysourse.mutableCopy() as! NSArray
            // 结果:copy 地址不变内容地址不变 mutablecopy 地址变了    ,内容地址没变
            //  0x600001e483c0-copysourse --0xbe218172ddca9470:0
            // 0x600001e483c0-copy----------0xbe218172ddca9470:0
            // 0x6000012047b0-mutablecopy--0xbe218172ddca9470:0
    
    1. 可变的拷贝源 例如NSMutableString、NSMutableArray
      • 调用copy 返回的结果,重新开辟空间 地址改变 ;返回的结果还是不可变的;
      • 调用mutableCopy 拷贝对象,地址改变;copy的结果可变
           // 案例一、用copy 与mutablecopy 拷贝  可变的字符串
            let copysourse = NSMutableString("可变的字符串")
            let copy1 = copysourse.copy()
            let copy2 = copysourse.mutableCopy()
          // 0x60000357cd20-copysourse
          // 0x60000357c000-copy 变
          // 0x60000357c480-mutablecopy: 变
    
           // 案例二、用copy 与mutablecopy 拷贝  可变的数组  数组内容是不可变的
            let v = NSString("a")
            let copysourse = NSMutableArray(array: [v])
            let copy1:NSArray = copysourse.copy() as! NSArray
            let copy2:NSArray = copysourse.mutableCopy() as! NSArray
            // 结果:copy 地址变了 内容地址不变 mutablecopy 地址变   了,内容地址没变
           //  0x600002b23a80-copysourse ----0x8486cdcf7f8e26e6:0
           //  0x60000271c350-copy-----------0x8486cdcf7f8e26e6:0
           //  0x600002b56520-mutablecopy---0x8486cdcf7f8e26e6:0
    

    三 、NSArray、NSString 用strong 还是copy 修饰 ?

    1. 不可变的源可以用copy修饰,原因就是多态性;
    2. 假如NSArray 变量 实际是一个可变的数组;那就会被修改,用copy 保证此属性不被修改

    四 、 NSMutableArray、NSMutableString 用strong 还是copy 修饰 ?

    用strong修饰,如果用copy 那就背离了可变的初衷,变成不可变的对象了;

    五、结论

    copy与mutablecopy 是两个动作;结果一个可变一个不可变;
    具体副本是浅拷贝还是深拷贝最终与拷贝源有关;假如拷贝源是不可变的的,copy 结果就是复制对象指针地址,不影响拷贝源,因为copy结果也是不可变得;mutablecopy拷贝对象重新分配内存,结果可变,最终原则只要拷贝源与拷贝结果互不影响就没问题;

    相关文章

      网友评论

          本文标题:copy与 mutablecopy

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