美文网首页
NSKeyedArchiver归档

NSKeyedArchiver归档

作者: 齊同学 | 来源:发表于2019-05-16 16:46 被阅读0次

    简介

    归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于决大多数支持存储数据的FoundationCocoa Touch类都遵循了NSCoding协议,因此,对于大多数类来说,归档相对而言还是比较容易实现的。

    1. 遵守NSCoding协议

    NSCoding协议声明的两个方法,这两个方法都是必须实现的。

     //解档来获取一个新对象。
       - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;
      //将对象编码到归档中
       - (void)encodeWithCoder:(NSCoder *)aCoder;
    
    • 如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前先实现父类的归档和解档方法。
    即 [super encodeWithCoder:aCoder] 和[super initWithCoder:aDecoder]方法;
    

    2. 存储

    需要把对象归档是调用NSKeyedArchiver的工厂方法 + (NSData *)archivedDataWithRootObject:(id)rootObject;方法。

     NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"];
     Person *person = [[Person alloc] init];
     person.avatar = self.avatarView.image;
     person.name = self.nameField.text;
     person.age = [self.ageField.text integerValue];
     [NSKeyedArchiver archiveRootObject:person toFile:file];
    

    需要从文件中解档对象就调用NSKeyedUnarchiver的一个工厂方法+ (nullable id)unarchiveObjectWithData:(NSData *)data;即可。

    NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"];
    Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
     if (person) {
     self.avatarView.image = person.avatar;
     self.nameField.text = person.name;
     self.ageField.text = [NSString stringWithFormat:@"%ld", person.age];
    }
    

    3. 总结

    1、必须遵循并实现NSCoding协议
    2、保存文件的扩展名可以任意指定
    3、继承时必须先调用父类的归档解档方法
    

    相关文章

      网友评论

          本文标题:NSKeyedArchiver归档

          本文链接:https://www.haomeiwen.com/subject/awoiaqtx.html