NSKeyedArchiver归档(NSCoding)

  • 如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复
  • 不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以

NSCoding协议有2个方法:

encodeWithCoder:

每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量

initWithCoder:

每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量

自定义对象归档

- (IBAction)save:(id)sender {

    Person *p = [[Person alloc] init];
    p.age = 18;

    // 获取cache
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];

    // 获取文件的全路径
    NSString *filePath = [cachePath stringByAppendingPathComponent:@"person.data"];

    // 把自定义对象归档
    [NSKeyedArchiver archiveRootObject:p toFile:filePath];

}
- (IBAction)read:(id)sender {

    // 获取cache
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];

    // 获取文件的全路径
    NSString *filePath = [cachePath stringByAppendingPathComponent:@"person.data"];

    // 解档
    Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

    NSLog(@"%d",p.age);

}

自定义对象中

遵守NSCoding协议 实现方法

// 什么时候调用:自定义对象归档的时候

// 作用:用来描述当前对象里面的哪些属性需要归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    // name
    [aCoder encodeObject:_name forKey:@"name"];

    // age
    [aCoder encodeInt:_age forKey:@"age"];

}


// 什么时候调用:解档对象的时候调用

// 作用:用来描述当前对象里面的哪些属性需要解档
// initWithCoder:就是用来解析文件的。
- (id)initWithCoder:(NSCoder *)aDecoder
{
    // super:NSObject
    //[super initWithCoder:aDecoder]当父类中有实现的时候,用父类的方法,不然用[super init]
    if (self = [super init]) {

        // 注意:一定要给成员变量赋值
        // name
       _name = [aDecoder decodeObjectForKey:@"name"];

        // age
       _age = [aDecoder decodeIntForKey:@"age"];

    }
    return self;
}

results matching ""

    No results matching ""