coderMy

iOS - runtime快速归解档 原创

2017-01-18 00:47:01

阅读量770

收藏

1赞

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

写评论
收藏
文章收藏成功
前往CSDN APP阅读全文
CSDN APP记录你的成长
微信小程序收藏浏览更方便
截图/长按 保存本地,用微信扫码打开
进入小程序随时浏览/收藏技术文章
需要前往CSDN APP登录即可继续互动
成就一亿技术人!
拼手气红包6.0元
发红包
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
前往CSDN APP阅读全文
阅读体验更佳

CSDN

成就一亿技术人

浏览器
分享
请升级应用版本