开通微博第一天 谢谢支持
基本的数据类型如NSString、NSDictionary、NSArray、NSData、NSNumber等可以用属性列表的方法持久化到.plist 文件中,但如果是一些自定义的类的话,属性列表的方法就不管用了。archiver 方法可以做到。
如果是自定义的模型,要实现数据持久化,自定义的模型要遵循NSCoding 协议。
NSCoding 是一个简单的协议,有两个方法: -initWithCoder: 和 encodeWithCoder:。遵循NSCoding协议的类可以被序列化和反序列化,这样可以归档到磁盘上或分发到网络上
废话不多说 直接上代码
.h文件
#import <Foundation/Foundation.h>
@interface HFAccount : NSObject <NSCoding>
/** string接口获取后的access token。*/
@property (nonatomic,copy) NSString *access_token;
/** 单位是秒数。*/
@property (nonatomic,copy) NSNumber *expires_in;
/** string当前用户的UID。*/
@property (nonatomic,copy) NSString *uid;
@end
.m文件
#import "HFAccount.h"
@implementation HFAccount
/**
* 当一个对象要归档进沙盒中时,就会调用这个方法
* 目的:在这个方法中说明这个对象的哪些属性要存进沙盒
*/
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:self.access_tokenforKey:@"access_token"];
[encoder encodeObject:self.expires_inforKey:@"expires_in"];
[encoder encodeObject:self.uidforKey:@"uid"];
}
/**
* 当从沙盒中解档一个对象时(从沙盒中加载一个对象时),就会调用这个方法
* 目的:在这个方法中说明沙盒中的属性该怎么解析(需要取出哪些属性)
*/
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [superinit]) {
self.access_token = [decoderdecodeObjectForKey:@"access_token"];
self.expires_in = [decoderdecodeObjectForKey:@"expires_in"];
self.uid = [decoderdecodeObjectForKey:@"uid"];
}
returnself;
}
@end
在你需要存储的地方
HFAccount *account = [[HFAccount alloc]init];
然后给你的模型赋值
// 自定义对象的存储必须用NSKeyedArchiver,不再有什么writeToFile方法
[NSKeyedArchiverarchiveRootObject:account toFile:HWAccountPath];
解档
// 加载模型
HFAccount *account = [NSKeyedUnarchiverunarchiveObjectWithFile:HWAccountPath];