iOS - runtime快速归解档

来源:互联网 发布:国际城市三字代码 数据 编辑:程序博客网 时间:2024/06/05 06:21

在开发中 , 通常会运用到一些全局的单例 , 保存用户的基本信息或者一些基本状态 . 这个时候可能会运用到单例来保存信息 , 保证全局获取到的都是最新的相同的信息. 并且,一般全局单例的属性较多 , 比如包括了用户的姓名,手机号,性别,城市,年龄等等众多信息.如果对该单例的各项属性进行归档, 那么得让此单例遵循协议,并实现 - (id)initWithCoder:(NSCoder *)decoder- (void)encodeWithCoder:(NSCoder *)encoder 方法.


首先 , 定义一个单例对象

+ (instancetype)shareInstance{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        account = [[JYAccount alloc]init];    });    return account;}

假如该单例有如下属性

@property (nonatomic, strong) NSNumber *sex;                 //性别@property (nonatomic, strong) NSNumber *registerTime;        //注册时间@property (nonatomic , copy) NSString *level;@property (nonatomic , copy) NSString *mobile;               //手机号@property (nonatomic , copy) NSString *nickName;             //昵称@property (nonatomic , copy) NSString *portrait;             //头像图片路径@property (nonatomic , copy) NSString *status;@property (nonatomic , copy) NSString *tokenId;              //唯一标识@property (nonatomic , copy) NSString *userName;             //用户名

归档


- (void)encodeWithCoder:(NSCoder *)encoder

此方法通俗一点讲 , 就是告诉系统该如何存属性 , 如果用通常的方法做 , 实现 - (void)encodeWithCoder:(NSCoder *)encoder方法如下

- (void)encodeWithCoder:(NSCoder *)encoder{    [encoder encodeObject:self.name forKey:@"sex"];    [encoder encodeObject:self.password forKey:@"registerTime"];    [encoder encodeObject:self.photo forKey:@"level"];    [encoder encodeObject:self.roleId forKey:@"mobile"];    [encoder encodeObject:self.sex forKey:@"nickName"];    [encoder encodeObject:self.tokenid forKey:@"portrait"];    [encoder encodeObject:self.userId forKey:@"status"];    [encoder encodeObject:self.phoneNum forKey:@"tokenId"];    [encoder encodeObject:self.phoneNum forKey:@"userName"];}

如果用runtime快速归档

- (void)encodeWithCoder:(NSCoder *)encoder{    unsigned int count;    Ivar *ivar = class_copyIvarList([JYAccount class], &count); //获取属性列表    for (NSInteger index = 0; index <count; index++) { //遍历属性列表获取每个属性 , 并从中取值        Ivar iv = ivar[index];        const char *name = ivar_getName(iv);        NSString *strName = [NSString stringWithUTF8String:name];        id value = [self valueForKey:strName];        [encoder encodeObject:value forKey:strName];    }    free(ivar); //释放}

解档


- (id)initWithCoder:(NSCoder *)decoder

 - (id)initWithCoder:(NSCoder *)decoder{    if (self = [super init]) {        self.name = [decoder decodeObjectForKey:@"sex"];        self.password = [decoder decodeObjectForKey:@"registerTime"];        self.photo = [decoder decodeObjectForKey:@"level"];        self.roleId = [decoder decodeObjectForKey:@"mobile"];        self.sex = [decoder decodeObjectForKey:@"nickName"];        self.tokenid = [decoder decodeObjectForKey:@"portrait"];        self.userId = [decoder decodeObjectForKey:@"status"];        self.phoneNum = [decoder decodeObjectForKey:@"tokenId"];        self.phoneNum = [decoder decodeObjectForKey:@"userName"];    }    return self;}

如果用tuntime快速解档

- (id)initWithCoder:(NSCoder *)decoder{    if (self = [super init]) {        unsigned int count = 0;        //获取类中所有成员变量名        Ivar *ivar = class_copyIvarList([JYAccount class], &count);  //获取属性列表        for (NSInteger index = 0; index<count; index++) {  //获取每个属性,并对其赋值            Ivar iva = ivar[index];            const char *name = ivar_getName(iva);            NSString *strName = [NSString stringWithUTF8String:name];            id value = [decoder decodeObjectForKey:strName];            [self setValue:value forKey:strName];        }        free(ivar); //释放    }    return self;}

当你的单例中,有上十个属性,甚至几十个属性时 , 灵活运用runtime进行归档 , 能为你省下不少的代码 ,看着也不至于很Low …

1 0
原创粉丝点击