Runtime 实现自定义对象归档

如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复

不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以

NSCoding协议有2个方法:

encodeWithCoder:
每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量

initWithCoder:
每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量

一、标准的自定义对象归档写法

1.NSKeyedArchiver专门用来做自定义对象归档

 什么时候调用:当一个对象要归档的时候就会调用这个方法归档

 作用:告诉苹果当前对象中哪些属性需要归档

- (void)encodeWithCoder:(NSCoder *)aCoder {

    [aCoder encodeObject:_name forKey:@"name"];

    [aCoder encodeInt:_age forKey:@"age"];

}

 

 什么时候调用:当一个对象要解档的时候就会调用这个方法解档

 作用:告诉苹果当前对象中哪些属性需要解档

 initWithCoder什么时候调用:只要解析一个文件的时候就会调用

- (id)initWithCoder:(NSCoder *)aDecoder {

#warning  [super initWithCoder]

    if (self = [super init]) {

         解档

         注意一定要记得给成员属性赋值

        _name = [aDecoder decodeObjectForKey:@"name"];

        _age = [aDecoder decodeIntForKey:@"age"];

    }

    return self;

}

如果归档时需要归档的属性太多的话,写起来就比较麻烦了.
这种情况下可以使用 Runtime 实现, 就可以省下很多代码.
二、Runtime 实现自定义对象归档

//告诉系统要归档那些属性
- (void)encodeWithCoder:(NSCoder *)aCoder {
    //利用runtime 归档
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([Person class], &count);
    for (int i = 0; i < count; i++) {
        Ivar ivar = ivars[i];
        const char *name = ivar_getName(ivar);
        NSString *key = [NSString stringWithUTF8String:name];
        //归档 KVC 根据一个 key 来获得一个值
        [aCoder encodeObject:[self valueForKey:key] forKey:key];
    }
    //注意: C 语言里, 但凡出现 copy create new 就需要释放
    free(ivars);
}
//告诉系统要解档那些属性
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super init]) {
        //解档
        unsigned int count = 0;
        Ivar *ivars = class_copyIvarList([Person class], &count);
        for (int i = 0; i < count; i++) {
            Ivar ivar = ivars[i];
            const char *name = ivar_getName(ivar);
            NSString *key = [NSString stringWithUTF8String:name];
            //解档
            id value = [aDecoder decodeObjectForKey:key];
            //KVC 设置值
            [self setValue:value forKey:key];
        }
        free(ivars);
    }
    return self;
}

如果本文对你有所帮助, 请点心支持一下😂

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 把 OC 中基本数据存储到沙盒中,被称为基本数据持久化。 基本数据,在 oc中有以下四种,分别为 NSString...
    flyrees阅读 1,268评论 0 0
  • 对于从事 iOS 开发人员来说,所有的人都会答出【runtime 是运行时】什么情况下用runtime?大部分人能...
    梦夜繁星阅读 3,832评论 7 64
  • 下面是我最近两年学习OC中的一些基础知识,对于学习OC基础知识的人可能有些帮助,拿出来分享一下,还是那句话不喜勿喷...
    小小赵纸农阅读 2,860评论 1 7
  • 转载自:http://www.mamicode.com/info-detail-957988.html 1、iOS...
    哆啦_阅读 2,447评论 0 2
  • 有一天,对平静无奇的生活厌倦了,那就来个翻天覆地的改变。 初入简书,不知其门道,不当之处,还请多多见谅。 记录生活...
    爱蹦哒的熊阅读 118评论 0 0

友情链接更多精彩内容