iOS对象复制工具

有时间了来整理一下一些小工具。


有些时候我们可能会需要对某一个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;
}

如果有什么不对的地方,欢迎斧正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容