深拷贝与浅拷贝

结论:

一.自定义的模型类
自定义的模型类如果直接赋值,那么新旧对象的所指向的堆内存地址是一样的,改变新对象的属性值会影响旧对象的属性.有利有弊.例如直接赋值可以减少页面跳转来回传值.如果怕数据错乱,控制不住,那么可以使用深拷贝,需要注意的是,自定义的对象不可以直接使用copy或者mutableCopy,需要遵守NSCopying, NSMutableCopying,实现协议方法


深拷贝与浅拷贝_第1张图片
image.png

二.集合类如数组和字典
直接使用时基本遵守以下表格,不过集合里面的对象都是浅拷贝,新集合里面元素的改变还是会改变旧集合里面的元素,如果不想被影响,可以使用归档和解档.

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mutableArray];
NSMutableArray *newMutableArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];

三.其它类
这个没什么特殊,遵守以下表格:

不可变类型 可变类型
copy 浅拷贝 深拷贝
mutableCopy 深拷贝 深拷贝

举例:
NSString使用copy时,新的NSString对象会指向旧NSString指向的内存空间.
NSString使用mutableCopy或者NSMutableString使用copy和mutableCopy时,新的对象指向的内存地址跟旧的对象不一样,指向的是旧对象所指向内存数据重新拷贝一份所在的内存地址.

你可能感兴趣的:(深拷贝与浅拷贝)