1、对象归档的对象属性只能是简单的属性,对象的属性最好不要是自定义对象.较复杂的对象不适合归档。
2、对象如果父类非NSObject,父类也要实现归档解档方法。且子类的解档跟归档方法里要实现父类的归档解档。
3、对象归档后的文件后缀可以是任意后缀。
4、对象里面涉及的其他自定义对象,其也要实现归解档。
自定义对象的沙盒存储:
字典、数组等文件的存储用writetoFile方法。对象的存储用NSKeyedArchiver。
从沙盒中取出自定义对象,也用NSKeyedArchiver。
将对象存入沙盒,一定要重写对象类系统存档、解档方法:
@interface HCAccount
: NSObject
/**
*当一个对象要归档进沙盒中时,就会调用这个方法
*目的:在这个方法中说明这个对象的哪些属性要存进沙盒
*/
-
(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.access_tokenforKey:@"access_token"];
[aCoder encodeObject:self.expires_inforKey:@"expires_in"];
[aCoder encodeObject:self.uidforKey:@"uid"];
}
/**
*当从沙盒中解档一个对象时(从沙盒中加载一个对象时),就会调用这个方法
*目的:在这个方法中说明沙盒中的属性该怎么解析(需要取出哪些属性)
*/
-
(id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
self.access_token = [aDecoderdecodeObjectForKey:@"access_token"];
self.expires_in = [aDecoderdecodeObjectForKey:@"expires_in"];
self.uid = [aDecoderdecodeObjectForKey:@"uid"];
}
return self;
}
#define
HCAccountPath [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES) lastObject]
stringByAppendingPathComponent:@"account.archive"]
@implementation
HCAccountTool
//存储账号信息
+
(void)saveAccount:(HCAccount *)account{
//获得账号存储时间(accessToken的产生时间)
account.created_time = [NSDate date];
//自定义对象的存储必须用NSKeyedArchiver
[NSKeyedArchiver archiveRootObject:accounttoFile:HCAccountPath];
}
//返回账号信息
+ (HCAccount
*)account{
//获取模型
HCAccount *account = [NSKeyedUnarchiverunarchiveObjectWithFile:HCAccountPath];
实现父类归解档:
/**
* 当一个对象要归档进沙盒中时,就会调用这个方法
* 目的:在这个方法中说明这个对象的哪些属性要存进沙盒
*/
- (void)encodeWithCoder:(NSCoder *)aCoder {
[super encodeWithCoder:aCoder];
[aCoder encodeObject:self.Name forKey:@"Name"];
[aCoder encodeObject:self.Code forKey:@"Code"];
}
/**
* 当从沙盒中解档一个对象时(从沙盒中加载一个对象时),就会调用这个方法
* 目的:在这个方法中说明沙盒中的属性该怎么解析(需要取出哪些属性)
*/
- (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
self.Name = [aDecoder decodeObjectForKey:@"Name"];
self.Code = [aDecoder decodeObjectForKey:@"Code"];
}
return self;
}