先上代码github,如有错误请帮忙指出,谢谢!转载请注明出处,喜欢的话,请点个赞吧!
一、概念
1、浅拷贝 = 指针拷贝:多了一个指针,指向同一块内存地址(同一个对象)。
2、深拷贝 = 内容拷贝:多了一个指针,指向不同的内存地址(不同的对象)。
二、总结
1、对于不可变的非集合类的对象,copy是浅拷贝,mutableCopy是深拷贝。
2、对于可变的非集合类的对象,copy和mutableCopy都是深拷贝。
3、对于不可变的数组,字典等集合类的对象,copy是浅拷贝,mutableCopy是深拷贝。
4、对于可变的数组,字典等集合类的对象,copy和mutableCopy都是深拷贝。
注:集合类的对象深拷贝拷贝的是本身对象,不包含里面的元素等对象,可以实现完全深拷贝整个集合对象请看下面代码解释
三、代码解释
1、不可变的非集合类对象
image.png2、可变的非集合类对象 image.png
3、不可变的集合类对象 image.png
4、可变的集合类对象 image.png
5、集合类对象的object的拷贝情况
注:集合类对象要实现对象里面的object也拷贝需要执行如下方法
1、- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;
/// 还有更多的归档解档扩展方法,具体请自行了解NSKeyedUnarchiver
2、+ (nullable id)unarchivedObjectOfClass:(Class)cls fromData:(NSData *)data error:(NSError **)error
从下图可以得出结论,不支持NSCopying,NSMutableCopying协议的例如NSString,NSNumber拷贝后object的地址还是一致,没有真正的复制一个出来,不过支持NSCopying,NSCoding的协议的object都能进行真正的深拷贝。
image.png
image.png image.png
网友评论