美文网首页iOS Developer
iOS对象复制工具

iOS对象复制工具

作者: anjohnlv | 来源:发表于2017-08-21 15:48 被阅读88次

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


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

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

    相关文章

      网友评论

        本文标题:iOS对象复制工具

        本文链接:https://www.haomeiwen.com/subject/nwmcdxtx.html