NSKeyedArchiver歸檔

簡介

歸檔在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. 注意
  • 必須遵循并實現NSCoding協議
  • 保存文件的擴展名可以任意指定
  • 繼承時必須先調用父類的歸檔解檔方法
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容