每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量。
每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量。
NSArray*array = [NSArray arrayWithObjects:@”a”,@”b”,nil];
[NSKeyedArchiver archiveRootObject:array toFile:path];
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
4. 自定义对象归档/解档总结:
1.如果要存储自定义对象一定要用“归档/解档”的操作;
2.plist.偏好设置都不能用来存储自定义的对象;
3.自定义对象归档/解档的时候一定要遵守<NSCoding>的协议;
4.只要解析文件都会调用initWithCoder:的方法;
5.在解档属性的时候,记得给属性赋值!!!!
6.为什么要遵守<NSCoding>协议? 为了告诉系统归档/解档哪些属性,告诉系统如何进行归档解档。
6. 一个自定义对象的归档解档Demo:
==================创建一个遵守 NSCoding 协议的类=========================
@interface Teacher : NSObject <NSCoding>
@property (nonatomic, assign) int age;
@property (nonatomic, copy) NSString* name;
@end
#import "Teacher.h"
@implementation Teacher
// 告诉系统需要归档哪些属性
- (void)encodeWithCoder:(NSCoder*)aCoder
{
[aCoder encodeInt:_age forKey:@"age111111"];
[aCoder encodeObject:_name forKey:@"name"];
}
// 告诉系统解档哪些属性
- (id)initWithCoder:(NSCoder*)aDecoder
{
if (self = [super init]) {
_age = [aDecoder decodeIntForKey:@"age111111"];
_name = [aDecoder decodeObjectForKey:@"name"];
}
return self;
}
@end
==================创建一个导入了 自定义Teacher类的控制器 ViewController =========================
#import "ViewController.h"
#import "Teacher.h"
@interface ViewController ()
@end
@implementation ViewController
// 存数据
- (IBAction)save:(id)sender
{
// tmp
NSString* tmpPath = NSTemporaryDirectory();
NSString* filePath = [tmpPath stringByAppendingPathComponent:@"teacher.data"];
Teacher* t = [[Teacher alloc] init];
t.name = @"传智播客";
t.age = 18;
[NSKeyedArchiver archiveRootObject:t toFile:filePath];
}
// 取数据
- (IBAction)read:(id)sender
{
NSString* tmpPath = NSTemporaryDirectory();
NSString* filePath = [tmpPath stringByAppendingPathComponent:@"teacher.data"];
Teacher* t = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%d", t.age);
}