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
- iOS - runtime快速归解档
- iOS runtime实用篇:让你快速上手一个项目
- [runtime] iOS-Runtime-Headers
- iOS runtime
- iOS Runtime
- iOS-runtime
- iOS Runtime
- IOS Runtime
- IOS - RunTime
- ios runtime
- ios runtime
- ios runtime
- iOS Runtime
- iOS runtime
- ios runtime
- iOS Runtime
- iOS - Runtime
- iOS--Runtime
- Hadoop2.5.2学习02--MR执行环境的类型
- ubuntu opencv3.2安装测试
- hawq4 查询慢
- php面向对象视频笔记之第四章(接口与多态)
- 特殊的数字
- iOS - runtime快速归解档
- 星星树
- 模拟实现Android的Handler
- Ubuntu16.04LTS安装zsh+oh-my-zsh+autojump
- 27.httpClien提交数据
- thinkphp模型$_auto自动完成设置为插入时更新操作也变化的解决办法
- 包含123数字的排序,次数尽量最少
- 【Android】RecyclerView具体用法
- 绘图,数组就是一个大变量,非常特殊的变量而已