iOS Developer

iOS对象复制工具

2017-08-21  本文已影响88人  anjohnlv

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


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

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

上一篇下一篇

猜你喜欢

热点阅读