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