copy与 mutablecopy
2021-07-17 本文已影响0人
扬起帆前行
一 、copy 与mutablecopy的区别?
复制:创建对象的副本;两种结果:复制指向对象的指针与复制整个对象 ;
针对这两种不同的结果:
- 复制对象指针的称为浅拷贝;
- 复制对象全部的称为深拷贝,(在内存中重新开辟一片空间)
在objective-c中有两种方法可以返回对象的副本:
- copy :
实现了NSCopying协议
func copy(with zone: NSZone? = nil) -> Any { }
复制的结果是不可变的,无论拷贝源是可变还是不可变; - mutableCopy:
实现了NSMutableCopying 协议
func mutableCopy(with zone: NSZone? = nil) -> Any { }
复制的结果是可变的,无论拷贝源是可变还是不可变;
结论
两者的区别:
- 实现的协议不一样
- 结果不一样: copy的结果是不可变的;mutablecopy的结果是可变的;
二、 列举不同的拷贝源 分别对应不同的copy输出的结果?
分两种讨论( 坚持的原则就是互不影响的前提下节省内存)
- 不可变的拷贝源 例如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
- 可变的拷贝源 例如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 修饰 ?
- 不可变的源可以用copy修饰,原因就是多态性;
- 假如NSArray 变量 实际是一个可变的数组;那就会被修改,用copy 保证此属性不被修改
四 、 NSMutableArray、NSMutableString 用strong 还是copy 修饰 ?
用strong修饰,如果用copy 那就背离了可变的初衷,变成不可变的对象了;
五、结论
copy与mutablecopy 是两个动作;结果一个可变一个不可变;
具体副本是浅拷贝还是深拷贝最终与拷贝源有关;假如拷贝源是不可变的的,copy 结果就是复制对象指针地址,不影响拷贝源,因为copy结果也是不可变得;mutablecopy拷贝对象重新分配内存,结果可变,最终原则只要拷贝源与拷贝结果互不影响就没问题;