一 、归档 (archive)—文件本地化的一种操作
归档是把对象写入文件中保存在硬盘中,当再次重新打开程序时,可以还原这些对象。
对象归档,就是把内存中对象持久化,对象解档就是持久化对象读取道内存。
【认识归档】
1、归档就是将对象按照特定的顺序写入到文件中,以便以后再次从文件中读取对象。
2、解档就是从已经归档的文件中读成对象的过程
3、进行归档的对象所属的类必需遵从NSCoding协议,必需实现协议中规定的方法
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;
4、进行归档的对象的子对象也要遵从NSCoding,也要实现协议中规定的方法,否则归档会失败
【归档使用】
1、系统类的归档
归档:
BOOL ret = [NSKeyedArchiverarchiveRootObject:dic toFile:PATH];
归档道本地如果归档成功返回YES;
解档:
id obj = [NSKeyedUnarchiver unarchiveObjectWithFile:PATH];
NSLog(@"%@", obj);
2、自定义类的归档
进行归档的对象所属类必须遵从NSCoding协议,必须实现协议中的方法,进行归档的子对象也得遵从NSCoding,也要实现协议中规定的方法!!
【JYStudent】类
@interface JYStudent :NSObject<NSCoding>
///需要遵从NSCoding协议
@property NSString *name;
@property int age;
@property float grade;
@property NSUInteger number;
- (instancetype)initWithName:(NSString *)name age:(int)age grade:(float)grade number:(NSUInteger)number;
@end
@implementation JYStudent
- (instancetype)initWithName:(NSString *)name age:(int)age grade:(float)grade number:(NSUInteger)number
{
if (self = [superinit]) {
_name = name;
_age = age;
_grade = grade;
_number = number;
}
return self;
}
- (NSString *)description
{
return [NSStringstringWithFormat:@"name:%@ age:%d grade:%.2f number:%lu",_name, _age, _grade,_number];
}
//在归档的时候调用(协议中的方法)(父类遵从子类也要遵从)
//归档编码
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_nameforKey:@"name"];
[aCoderencodeInt:_ageforKey:@"age"];
[aCoderencodeFloat:_gradeforKey:@"grade"];
}
//在解档的时候调用(协议中的方法)
//归档解码
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [superinit]) {
_name = [aDecoder decodeObjectForKey:@"name"];
_age = [aDecoder decodeIntForKey:@"age"];
_grade = [aDecoder decodeFloatForKey:@"grade"];
_number = [aDecoder decodeIntegerForKey:@"number"];
}
return self;
}
@end
【JYClass】类
@class JYStudent;
@interface JYClass :NSObject<NSCoding>
//需要遵从NSCoding协议
@propertyNSString *className;
@propertyJYStudent *student;
@end
@implementation JYClass
- (NSString *)description
{
return [NSStringstringWithFormat:@"className:%@\n student:%@",_className,_student];
}
- (void)encodeWithCoder:(NSCoder *)aCode
{
[aCode encodeObject:_classNameforKey:@"className"];
[aCode encodeObject:_studentforKey:@"student"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [superinit]) {
_className = [aDecoder decodeObjectForKey:@"className"];
_student = [aDecoder decodeObjectForKey:@"student"];
}
return self;
}
@end
【main】
JYClass *iOS1507 = [[JYClassalloc] init];
iOS1507.className =@"ZZ-iOS1507";
JYStudent *stu = [[JYStudentalloc] initWithName:@"xiaoWang"age:18 grade:80 number:250];
iOS1507.student = stu;
//归档
BOOL ret = [NSKeyedArchiverarchiveRootObject:iOS1507 toFile:PATH];
if (ret == YES) {
NSLog(@"归档成功");
}else {
NSLog(@"归档失败");
}
id class = [NSKeyedUnarchiverunarchiveObjectWithFile:PATH];//解档
NSLog(@"%@", class);