天天看点

IOS开发模块总结(一)本地数据存储7 NSKeyedArchiver归档

简介

归档在iOS中是另一种形式的序列化,只要遵循了

NSCoding

协议的对象都可以通过它实现序列化。由于决大多数支持存储数据的

Foundation

Cocoa 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. 注意
  • 必须遵循并实现NSCoding协议
  • 保存文件的扩展名可以任意指定
  • 继承时必须先调用父类的归档解档方法