iOS运行时加KVC实现深复制

2017-12-12  本文已影响0人  修罗大人

首先导入运行时

#import <objc/runtime.h>

然后实现如下方法:

- (id)copyWithZone:(NSZone *)zone
{
    XLCommentModel *cModel = class_createInstance([XLCommentModel class], 0);
   
    // 成员变量的数量
    unsigned int outCount = 0;
   
    // 获得所有的成员变量
    Ivar *ivars = class_copyIvarList([XLCommentModel class], &outCount);
   
    // 遍历所有的成员变量
    for (int i = 0; i<outCount; i++) {
        // 取出i位置对应的成员变量
        Ivar oldIvar = ivars[i];
       
        //成员变量名
        NSString *key = [NSString stringWithCString:ivar_getName(oldIvar) encoding:NSUTF8StringEncoding];
        //成员变量值
        id value = [self valueForKey:key];
        //复制成员变量值
        [cModel setValue:value forKey:key];
       
        // 获得成员变量的名字
//        NSLog(@"变量名:%s 变量类型:%s", ivar_getName(oldIvar),ivar_getTypeEncoding(oldIvar));
    }
   
    // 如果函数名中包含了copy\new\retain\create等字眼,那么这个函数返回的数据就需要手动释放
    free(ivars);
   
    return cModel;
}

上一篇下一篇

猜你喜欢

热点阅读