前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用runtime进行归档解档

利用runtime进行归档解档

作者头像
用户1451823
发布2018-09-13 15:33:29
3870
发布2018-09-13 15:33:29
举报
文章被收录于专栏:DannyHoo的专栏DannyHoo的专栏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1337720

做过iOS开发的应该都知道数据的本地化的方式,其中归档就是其中的一种。说实话,在本人在项目中并不是很常用归档来进行数据的本地存储。今天之所以写这篇博客是因为最近了解到原来我们还能利用runtime进行归档和解档。

先来看一下我们之前的归档、解档代码:

例如我们要对Person这个拥有name和age属性的类的某个对象进行归档,其中Person类中的代码:

#import "Person.h"

@interface Person ()<NSCoding>

@end

@implementation Person

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

    aCoder encodeObject:_name forKey:@"name";

    aCoder encodeObject:_age forKey:@"age";

}

  • (instancetype)initWithCoder:(NSCoder *)coder

{

self = super init;

if (self) {

_name = coder decodeObjectForKey:@"name";

_age = coder decodeObjectForKey:@"age";

    }

return self;

}

@end

进行归档和解档的代码:

  • (IBAction)writeAction:(id)sender {

NSLog(@"归档");

Person * person = Person new;

    person.name = @"梁森";

    person.age = @"26";

NSString * temp = NSTemporaryDirectory();

NSString * filePath = temp stringByAppendingPathComponent:@"person.m";

NSLog(@"%@", filePath);

    NSKeyedArchiver archiveRootObject:person toFile:filePath;

}

  • (IBAction)readAction:(id)sender {

NSLog(@"解档");

NSString * temp = NSTemporaryDirectory();

NSString * filePath = temp stringByAppendingPathComponent:@"person.m";

Person * person = NSKeyedUnarchiver unarchiveObjectWithFile:filePath;

NSLog(@"%@  %@", person.name, person.age);

}

利用runtime进行归档、解档的归档、解档代码和普通的解档、归档代码一样,不一样的地方就是Person类中的代码:

#import "Person.h"

// 引入运行时头文件

#import <objc/runtime.h>

@interface Person()<NSCoding>

@end

@implementation Person

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

//属性的个数

unsigned int count = 0;

Ivar * ivars = class_copyIvarList(Person class, &count);

for (int i = 0; i < count; i++) {

//取出对应的Ivar

Ivar ivar = ivarsi;

//拿到名称

const char * name = ivar_getName(ivar);

//OC 字符串

NSString * key = NSString stringWithUTF8String:name;

//归档

        [aCoder encodeObject:self valueForKey:key forKey:key];

    }

}

  • (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{

self = super init;

if (self) {

//属性的个数

unsigned int count = 0;

Ivar * ivars = class_copyIvarList(Person class, &count);

for (int i = 0; i < count; i++) {

//取出对应的Ivar

Ivar ivar = ivarsi;

//拿到名称

const char * name = ivar_getName(ivar);

//OC 字符串

NSString * key = NSString stringWithUTF8String:name;

//解档

id value = aDecoder decodeObjectForKey:key;

//KVC--设置值到属性上面!!!

            self setValue:value forKey:key;

        }

    }

return self;

}

@end

看起来好像利用runtime的代码反而更多了,其实不然。如果某个类的属性特别多,假设Person这个类有十个属性,那么我们利用之前的方式,Person中的代码就会很多而且都是一些重复的代码。而我们在使用runtime之后不管我们要进行归档的某个类有多少个属性,这个类中的代码都是一样的多。

解读利用runtime归档Person中的代码:

利用runtime中的某些方法我们获取某个类的所有属性个数以及属性名称,然后利用了for循环对类中的所有属性进行归档、解档的操作。同时还利用到了KVC设置值到属性上面。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年03月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档