有时间了来整理一下一些小工具。
有些时候我们可能会需要对某一个Model进行操作,操作后又不希望改变源数据。
这个时候能想到的
1、New一个新对象,然后赋值。
2、实现<NSCopying>协议。实际上还是一条一条地复制。
如果对象比较复杂,或操作对象比较多。都是一件比较费时的事。于是我封装了以下自动复制的类:AutoCopy。
下载地址:https://github.com/anjohnlv/AutoCopy
使用方法:
1、下载NSObject+Copy.h与NSObject+Copy.m,并导入工程。
2、在需要浮动的地方引入头#import "NSObject+Copy.h"
3、对需要复制的对象调用autoCopy方法:Person *clone = [person autoCopy];
这个小工具不支持NSArray,NSDictionary等对象,这些对象可直接调用mutableCopy。
说下原理:在运行时获取到类的所有属性名,并通过kvc将值从老model取出赋值到新model。
-(NSArray *)allPropertyName {
unsigned int propertyCount = 0;
objc_property_t *properties = class_copyPropertyList([self class], &propertyCount);
NSMutableArray *allPropertyName = [NSMutableArray new];
for (unsigned int i = 0; i < propertyCount; ++i) {
objc_property_t property = properties[i];
NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
[allPropertyName addObject:propertyName];
}
free(properties);
return allPropertyName;
}
-(instancetype)autoCopy {
if (self) {
id copyObject = [[self class] new];
NSArray *allPropertyName = [self allPropertyName];
for (int i=0; i<[allPropertyName count]; i++) {
NSString *propertyName = allPropertyName[i];
[copyObject setValue:[self valueForKey:propertyName] forKey:propertyName];
}
return copyObject;
}
return self;
}
如果有什么不对的地方,欢迎斧正。