iOS - runtime快速归解档

在开发中 , 通常会运用到一些全局的单例 , 保存用户的基本信息或者一些基本状态 . 这个时候可能会运用到单例来保存信息 , 保证全局获取到的都是最新的相同的信息. 并且,一般全局单例的属性较多 , 比如包括了用户的姓名,手机号,性别,城市,年龄等等众多信息.如果对该单例的各项属性进行归档, 那么得让此单例遵循协议,并实现 - (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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值