【开发技巧】KVC的利用:1,实现归档中的 encodeWithCoder 和 initWithCoder方法

1,归档和解档

- (void)encodeWithCoder:(NSCoder *)aCoder {
    unsigned int count;
    Ivar *ivar = class_copyIvarList([self class], &count);
    for (int i = 0 ; i < count ; i++) {
        Ivar iv = ivar[i];
        const char *name = ivar_getName(iv);
        NSString *strName = [NSString stringWithUTF8String:name];
        //利用KVC取值
        id value = [self valueForKey:strName];
        [aCoder encodeObject:value forKey:strName];
    }
    free(ivar);
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    if (self != nil) {
        unsigned int count = 0;
        Ivar *ivar = class_copyIvarList([self class], &count);
        for (int i= 0 ;i < count ; i++) {
            Ivar var = ivar[i];
            const char *keyName = ivar_getName(var);
            NSString *key = [NSString stringWithUTF8String:keyName];
            id value = [aDecoder decodeObjectForKey:key];
            [self setValue:value forKey:key];
        }
        free(ivar);
    }
    return self;
}

对比普通方法

-(void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeBool:self.launchTrendsStatus forKey:@"launchTrendsStatus"];
    [aCoder encodeInteger:self.trendsModelType forKey:@"trendsModelType"];
    [aCoder encodeInt:self.ID forKey:@"ID"];

    [aCoder encodeObject:self.coverImage forKey:@"coverImage"];
    [aCoder encodeObject:self.voiceFileUrl forKey:@"voiceFileUrl"];
    [aCoder encodeObject:self.imageIdentitiyArr forKey:@"imageIdentitiyArr"];
    [aCoder encodeObject:self.urlArr forKey:@"urlArr"];
    
    // 模型
    [aCoder encodeObject:self.trendsModel forKey:@"trendsModel"];
    [aCoder encodeObject:self.voiceModel forKey:@"voiceModel"];
}

-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    self = [super init];
    if (self) {
        self.launchTrendsStatus = [aDecoder decodeBoolForKey:@"launchTrendsStatus"];
        self.trendsModelType = [aDecoder decodeIntegerForKey:@"trendsModelType"];
        self.ID = [aDecoder decodeIntForKey:@"ID"];
        self.coverImage = [aDecoder decodeObjectForKey:@"coverImage"];
        self.voiceFileUrl = [aDecoder decodeObjectForKey:@"voiceFileUrl"];
        self.imageIdentitiyArr = [aDecoder decodeObjectForKey:@"imageIdentitiyArr"];
        self.urlArr = [aDecoder decodeObjectForKey:@"urlArr"];
        
        // 模型
        self.voiceModel = [aDecoder decodeObjectForKey:@"voiceModel"];
        self.trendsModel = [aDecoder decodeObjectForKey:@"trendsModel"];
    }
    return self;
}

2,打印自定义对象信息

- (NSString *)description{
    
    NSMutableString *desc = @"对象{\n".mutableCopy;
    
    unsigned int count;
    Ivar *ivar = class_copyIvarList([self class], &count);
    for (int i = 0 ; i < count ; i++) {
        Ivar iv = ivar[i];
        const char *name = ivar_getName(iv);
        NSString *strName = [NSString stringWithUTF8String:name];
        //利用KVC取值
        id value = [self valueForKey:strName];
        [desc appendString:[NSString stringWithFormat:@", %@: %@\n", strName, value]];
    }
    free(ivar);
    
    [desc appendString:@"}"];
    return desc;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,734评论 25 709
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,875评论 6 13
  • 1、 沙盒概念基本介绍 iOS 应用程序只能在该 app 的文件系统中读取。这个默认的 app 文件系统就是我们说...
    Laughingg阅读 7,756评论 2 10
  • 我所谈的理性人并不完全是经济学上的假设。 我们生活的社会中,总是有形形色色的约束,然而这些约束大多围绕着一个“情”...
    苏矮子阅读 1,846评论 0 0
  • 对于淮安印象最深的就是“淮安的水”了。 对淮安的水的认识,是从淮安的地名开始的。淮安属于地级市,和我们运城市级别相...
    杨金社阅读 3,339评论 0 1