copy与 mutablecopy

一 、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)