一.简单说明
二.代码示例
1.首先创建一个模型对象类, 在.h文件中如下:
#import <Foundation/Foundation.h>
@interface Teacher : NSObject <NSCoding>
@property (copy, nonatomic) NSString* name;
@property (assign, nonatomic) int age;
@end
#import "Teacher.h"
@implementation Teacher
// 告诉系统需要归档哪些属性
- (void)encodeWithCoder:(NSCoder*)aCoder
{
[aCoder encodeObject:_name forKey:@"name111"];
[aCoder encodeInt:_age forKey:@"age"];
}
// 告诉系统需要解档哪些属性
- (id)initWithCoder:(NSCoder*)aDecoder
{
if (self = [super init]) {
_name = [aDecoder decodeObjectForKey:@"name111"];
_age = [aDecoder decodeIntForKey:@"age"];
}
return self;
}
@end
然后在需要归档的文件中如下代码:
// 存数据
- (IBAction)save:(id)sender
{
// 第一种存储路径 tmp
// NSString* docPath = NSTemporaryDirectory();
// 第一种存储路径
NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
// 文件的路径
NSString* filePath = [docPath stringByAppendingPathComponent:@"teacher.data"];
//创建对象
Teacher* t = [[Teacher alloc] init];
t.name = @"德玛西亚";
t.age = 18;
// 归档
[NSKeyedArchiver archiveRootObject:t toFile:filePath];
}
// 取数据
- (IBAction)read:(id)sender
{
// tmp
// NSString *docPath = NSTemporaryDirectory();
// 第一种存储路径
NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
// 文件的路径
NSString* filePath = [docPath stringByAppendingPathComponent:@"teacher.data"];
// 解档
Teacher* t = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@", t.name);
}
三.一些要点说明
1.遵守NSCoding 协议, 并实现该协议中的两个办法
- (void)encodeWithCoder:(NSCoder*)aCoder;
- (id)initWithCoder:(NSCoder*)aDecoder;
2.如果是继承, 则子类一定要重写那两个方法.因为Teacher的子类在存取的时候,会在子类中去找调用的方法, 没找到那么他就去父类中找, 所以最后保存和读取的时候新增加的属性会被忽略.. 需要先调用父类的方法, 先初始化父类的,在初始化子类的.
3.保存数据的文件的后缀名(@"teacher.data")可以随意命名;
4.通过 plist保存的数据是直接显示的, 不安全.通过归档方法保存的数据在文件中打开是乱码的, 更安全.