摘要:简单来说,深拷贝就是内容拷贝,浅拷贝就是指针拷贝。更具体的用法,就不作过多解释,自行百度吧。由于数据的复杂性或者没有实现协议,简单的使用来拷贝可能无法达到预期效果,由此就有了的衍生使用。
首先了解两个概念:深拷贝和浅拷贝。
简单来说,深拷贝就是内容拷贝,浅拷贝就是指针拷贝。更具体的用法,就不作过多解释,自行百度吧。
// 字符串是直接赋值的,右侧如果是copy,那么就是浅拷贝;右侧如果是mutableCopy,那么就是深拷贝。 NSString *string1 = @"helloworld"; NSString *string2 = [string1 copy]; // 浅拷贝 NSString *string3 = [string1 mutableCopy]; // 深拷贝 NSMutableString *string4 = [string1 copy]; // 浅拷贝 NSMutableString *string5 = [string1 mutableCopy]; // 深拷贝 NSLog(@"string1 = %d;string2 = %d",string1,string2); NSLog(@"string1 = %d;string3 = %d",string1,string3); NSLog(@"string1 = %d;string4 = %d",string1,string4); NSLog(@"string1 = %d;string5 = %d",string1,string5);
打印结果:
使用场景:在某些时候,需要复制一份相同的Model数据,但是又不影响原Model,类似上述的深拷贝,又或者在大量相同字段中需要改变其中一个字段的值。由于Model数据的复杂性或者没有实现NSCopy协议,简单的使用Copy来拷贝可能无法达到预期效果,由此就有了MJExtension的衍生使用。
核心代码:// // NSObject+TMCopy.h // LJDY // // Created by TIM on 16/8/23. // Copyright © 2016年 mimi. All rights reserved. // #import@interface NSObject (TMCopy) /** 实现类的copy */ - (id)tm_copy; @end
// // NSObject+TMCopy.m // LJDY // // Created by TIM on 16/8/23. // Copyright © 2016年 mimi. All rights reserved. // #import "NSObject+TMCopy.h" @implementation NSObject (TMCopy) - (id)tm_copy { Class clazz = [self class];; __strong Class newClass = [[clazz alloc] init]; Class superClass = self.superclass; while (superClass && ![NSStringFromClass(superClass) isEqualToString:@"NSObject"]) { [self setupValueWithNewClass:newClass Class:superClass]; superClass = superClass.superclass; } [self setupValueWithNewClass:newClass Class:clazz]; return newClass; } - (void)setupValueWithNewClass:(Class)newClass Class:(Class)clazz { int i; unsigned int propertyCount = 0; //runtime 获取类的所有属性 objc_property_t *propertyList = class_copyPropertyList(clazz, &propertyCount); NSDictionary *dic; //获取数组中需要转换的模型类 if ([clazz respondsToSelector:@selector(mj_objectClassInArray)]) { dic = [clazz mj_objectClassInArray]; } for (i = 0; i < propertyCount; i++) { objc_property_t *thisProperty = propertyList + i; const char *propertyName = property_getName(*thisProperty); //属性名 NSString *property = [NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding]; id value = [self valueForKey:property]; //如果对象是模型类,则再次遍历模型类中的属性 if (dic && [[dic allKeys] containsObject:property]) { //特殊处理模型中包含模型数组 if ([value isKindOfClass:[NSArray class]]) { NSMutableArray *modelArray = [NSMutableArray array]; for (Class _arrayClass in value) { [modelArray addObject:[_arrayClass tm_copy]]; } [newClass setValue:modelArray forKey:property]; } else { id _class = [value tm_copy]; [newClass setValue:_class forKey:property]; } } else { [newClass setValue:value forKey:property]; } } free(propertyList); } @end使用方法:
FriendItem *_item = [item tm_copy];结果:
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/17088.html
摘要:继续进行优秀开源框架的源码学习,这次打算学习一些常用的解析的框架,比如,,等。这句代码也就是递归思想的提现,如果这个成员变量是一个自定义类的,那么该成员变量对应的值应该也是一个,所以用这个二级的类继续调用方法,继续解析下去。 继续进行优秀开源框架的源码学习,这次打算学习一些常用的model解析的框架,比如YYModel,MJExtension,Mantle等。我自己用过YYModel和...
摘要:接上篇源码学习一总览这一次我们来看最新版本的代码,当前最新为在看源码之前,注意这个类。因为它重写了方法,然后把使用的的一些配置,统一写到了这个文件中。项目中还有很多其他的细节就不单说了。 接上篇MJExtension源码学习(一) 总览 这一次我们来看MJExtension最新版本的代码,当前最新为3.0.15 在看源码之前,注意MJExtensionConfig这个类。因为它重写了+...
摘要:然而,副作用对于系统的可测试性来说就是一剂毒药,并且可能会因应用程序和请求的不同而出现差异性。这些事件并不具备特定时序性,甚至它们可能同时发生。粘性动画中,粘性小球会根据移动距离的大小拥有不同的弹性程度。 PPAsyncDrawingKit - 实现了一系列基础 UI 控件的轻量级 ASDK 一款轻量级的 ASDK,实现了一系列基础 UI 控件。 iOS 开发之 Runtime 常用示...
阅读 1504·2023-04-25 23:43
阅读 632·2021-11-24 09:39
阅读 514·2021-11-22 15:25
阅读 1473·2021-11-22 12:08
阅读 943·2021-11-18 10:07
阅读 1944·2021-09-23 11:22
阅读 3153·2021-09-22 15:23
阅读 2238·2021-09-13 10:32