将各种类型的对象存储到文件中,而不仅仅是字符串、数组和字典类型,有一种更灵活的方法。就是利用NSKeyedAarchiver类创建带键(keyed)的档案来完成。归档某个对象时,会为它提供一个名称,即键。从归档中检索该对象时,是根据这个键来检索的。这样可以按照任意的顺序将对象写入归档并进行检索。另外,如果向类添加了新的实例变量或删除了实例变量,程序也可以进行处理。
代码如下:
首先,创建一个Person类,定义属性
@interface Person : NSObject<NSCoding>
/** 姓名 */
@property (nonatomic,copy) NSString * name;
/** 年龄 */
@property(nonatomic,assign) int age;
/** 身高 */
@property(nonatomic,assign) float height;
/** 电话 */
@property (nonatomic,copy) NSString * number;
+ (Person *)person;
@end
@implementation Person
+ (Person *)person
{
return [[self alloc] init];
}
//写入文件时调用 1.哪些属性需要归档 2.这么归档
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:_name forKey:@"name"];
[encoder encodeInt:_age forKey:@"age"];
[encoder encodeFloat:_height forKey:@"height"];
[encoder encodeObject:_number forKey:@"number"];
}
//读取文件的时候调用 1.哪些属性要读取 2.这么读取
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super init]) {
_name = [decoder decodeObjectForKey:@"name"];
_age = [decoder decodeIntForKey:@"age"];
_height = [decoder decodeFloatForKey:@"height"];
_number = [decoder decodeObjectForKey:@"number"];
}
return self;
}
@end
ViewController.m文件
- (IBAction)save
{
Person * p = [Person person];
p.name = @"xxc";
p.age = 16;
p.height = 1.75;
p.number = @"1862354789";
//将p对象的属性保存到文件中
NSString * path = @"/Users/AppleMac/Desktop/Person.data";
[NSKeyedArchiver archiveRootObject:p toFile:path];
}
- (IBAction)read
{
NSString * path = @"/Users/AppleMac/Desktop/Person.data";
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"%@ - %d - %f - %@ ",p.name,p.age,p.height,p.number);
}
再创建一个学生类Student,继承自Person类
#import "Person.h"
@interface Student : Person
/** 学生学号 */
@property(nonatomic,assign) int ID;
@end
在Student.m文件中实现encode和init的两个方法,并且调用父类的这两个方法,将子类的属性进行归档和反归档。
#import "Student.h"
@implementation Student
- (void)encodeWithCoder:(NSCoder *)encoder
{
[super encodeWithCoder:encoder];
[encoder encodeInt:_ID forKey:@"ID"];
}
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super initWithCoder:decoder]) {
_ID = [decoder decodeIntForKey:@"ID"];
}
return self;
}
@end