iOS - 如何深拷贝Array内元素、自定义对象、及自定义对象的属性(下)
2023-09-27 14:25:58 时间
查看输出
2021-05-09 11:33:47.241685 0800 AlgorithmDemo[17319:89117] array1 0x102a04450 class __NSArrayM array2 0x102a04550 class __NSSingleObjectArrayI array3 0x102a04570 class __NSArrayM 数组内元素 array1[0] 0x102a042c0 class Person array2[0] 0x102a042c0 class Person array3[0] 0x102a042c0 class Person
我们发现数组对象已经被深拷贝 但数组对象内的元素还是浅拷贝
是不是我们在定义Person类的时候没有重写方法呢 我们把改一下Person类的代码 并对NSMutableArray内元素进行copy
! 此处的copyWithZone mutableCopyWithZone方法里 我们应该对属性也进行copy
// // Person.m // AlgorithmDemo // Created by Ternence on 2021/5/9. #import Person.h interface Person () NSCopying, NSMutableCopying, NSCoding implementation Person - (id)copyWithZone:(NSZone *)zone { Person *person [Person allocWithZone:zone]; person.nickname [self.nickname copy]; return person; - (id)mutableCopyWithZone:(NSZone *)zone { Person *person [Person allocWithZone:zone]; person.nickname [self.nickname mutableCopy]; return person; end
测试代码
Person *person [[Person alloc] init]; person.nickname 码代码的小马 NSMutableArray *array1 [NSMutableArray arrayWithObjects:person, nil]; NSArray *array2 [array1 copy]; NSMutableArray *array3 [array1 mutableCopy]; NSMutableArray *array4 [[NSMutableArray alloc] initWithArray:array1 copyItems:true]; NSMutableArray *array5 [[NSMutableArray alloc] initWithObjects:[array1[0] copy], nil]; NSMutableArray *array6 [[NSMutableArray alloc] initWithObjects:[array1[0] mutableCopy], nil]; NSLog( \n array1 %p class % , array1, [array1 class]); NSLog( \n array2 %p class % , array2, [array2 class]); NSLog( \n array3 %p class % , array3, [array3 class]); NSLog( \n array4 %p class % , array4, [array4 class]); NSLog( \n array5 %p class % , array5, [array5 class]); NSLog( \n array6 %p class % , array6, [array6 class]); NSLog( \n\n 数组内元素 Person *orgArrayObj (Person *)array1[0]; Person *newArrayObj2 (Person *)array2[0]; Person *newArrayObj3 (Person *)array3[0]; Person *newArrayObj4 (Person *)array4[0]; Person *newArrayObj5 (Person *)array5[0]; Person *newArrayObj6 (Person *)array6[0]; NSLog( \n array1[0] %p nickname %p , orgArrayObj, orgArrayObj.nickname); NSLog( \n array2[0] %p nickname %p , newArrayObj2, newArrayObj2.nickname); NSLog( \n array3[0] %p nickname %p , newArrayObj3, newArrayObj3.nickname); NSLog( \n array4[0] %p nickname %p , newArrayObj4, newArrayObj4.nickname); NSLog( \n array5[0] %p nickname %p , newArrayObj5, newArrayObj5.nickname); NSLog( \n array6[0] %p nickname %p , newArrayObj6, newArrayObj6.nickname);
继续查看打印结果
2021-05-10 11:18:25.020830 0800 AlgorithmDemo[98320:429537] array1 0x10041a790 class __NSArrayM array2 0x100419b60 class __NSSingleObjectArrayI array3 0x10041a880 class __NSArrayM array4 0x10041a9f0 class __NSArrayM array5 0x10041aa20 class __NSArrayM array6 0x10041ac70 class __NSArrayM 数组内元素 array1[0] 0x10041a340 nickname 0x1000083a0 array2[0] 0x10041a340 nickname 0x1000083a0 array3[0] 0x10041a340 nickname 0x1000083a0 array4[0] 0x100417660 nickname 0x1000083a0 array5[0] 0x100415370 nickname 0x1000083a0 array6[0] 0x100412300 nickname 0x10041ad20
我们再根据打印归纳总结一下
对于重写copyWithZone:、mutableCopyWithZone:的自定义对象
此时我们知道了 要对自定义对象进行深拷贝 解决方案是重写copyWithZone、mutableCopyWithZone,调用对应的方法即可
先改一下person类
// // Person.m // AlgorithmDemo // Created by Ternence on 2021/5/9. #import Person.h interface Person () NSCopying, NSMutableCopying, NSCoding implementation Person - (instancetype)initWithCoder:(NSCoder *)coder { self.nickname [coder decodeObjectForKey: nickname return self; - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.nickname forKey: nickname end
再改写测试代码
Person *person [[Person alloc] init]; person.nickname 码代码的小马 NSMutableArray *array1 [NSMutableArray arrayWithObjects:person, nil]; NSData *data [NSKeyedArchiver archivedDataWithRootObject:array1]; NSMutableArray *array2 [NSKeyedUnarchiver unarchiveObjectWithData:data]; NSLog( \n array1 %p class % , array1, [array1 class]); NSLog( \n array2 %p class % , array2, [array2 class]); NSLog( \n\n 数组内元素 Person *orgArrayObj (Person *)array1[0]; Person *newArrayObj2 (Person *)array2[0]; NSLog( \n array1[0] %p nickname %p , orgArrayObj, orgArrayObj.nickname); NSLog( \n array2[0] %p nickname %p , newArrayObj2, newArrayObj2.nickname);
再耐心查看一下打印
2021-05-10 11:41:52.420699 0800 AlgorithmDemo[2252:455650] array1 0x103b04e50 class __NSArrayM array2 0x103b06f30 class __NSArrayM 数组内元素 array1[0] 0x10061dcc0 nickname 0x1000083a0 array2[0] 0x103b05860 nickname 0x103b06120
很明显 array对象深拷贝了 array内的自定义对象person深拷贝了 自定义对象person的nickname也深拷贝了
iOS对象属性详解 retain,strong, copy,weak,assign,readonly, readwrite, unsafe_unretained 下面来分别讲讲各自的作用和区别:
产品百科 | RTC iOS SDK 如何设置视频属性 本文将为您介绍如何设置视频流规格、视频流类型和视频属性。阅读本文后,你可以根据实际业务需求设置视频属性,以达到更好的产品体验。
相关文章
- iOS获取设备型号
- iOS中NSURL常用属性
- iOS使用CoreLocation实现指南针
- iOS属性声明关键字atomic与nonatomic
- ios 的 desciption
- 6月12日云栖精选夜读:【干货】iOS 11 短信拦截功能初探
- 《Swift开发实战》——第1章,第1.4节启动iOS 8模拟器
- 基于XCode IOS开发系统实现的新闻APP【100010688】
- [iOS]UIButton内、外边距设置
- 在IOS中根据圆心坐标、半径和角度计算圆弧上的点坐标
- iOS基本UI控件总结
- Hello_IOS ios开发transform属性
- iOS之宏定义#define
- ios的@property属性和@synthesize属性
- The Structure of an App-ios应用架构-MVC
- [iOS Reverse]logify日志追踪,锁定注入口-控制台查看
- 如何解决iOS通过pod集成扫码SDK打包后无法上传到App Store的问题?
- ios 上传文件
- input属性placeholder在iOS中显示不完整的解决方法