簡(jiǎn)介
歸檔在iOS中是另一種形式的序列化,只要遵循了
NSCoding
協(xié)議的對(duì)象都可以通過(guò)它實(shí)現(xiàn)序列化。由于決大多數(shù)支持存儲(chǔ)數(shù)據(jù)的Foundation
和Cocoa Touch
類都遵循了NSCoding
協(xié)議舶斧,因此,對(duì)于大多數(shù)類來(lái)說(shuō),歸檔相對(duì)而言還是比較容易實(shí)現(xiàn)的算柳。
1. 遵守NSCoding
協(xié)議
NSCoding協(xié)議聲明的兩個(gè)方法,這兩個(gè)方法都是必須實(shí)現(xiàn)的姓言。
//解檔來(lái)獲取一個(gè)新對(duì)象瞬项。
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;
//將對(duì)象編碼到歸檔中
- (void)encodeWithCoder:(NSCoder *)aCoder;
*如果需要?dú)w檔的類是某個(gè)自定義類的子類時(shí),就需要在歸檔和解檔之前先實(shí)現(xiàn)父類的歸檔和解檔方法何荚。即 [super encodeWithCoder:aCoder]
和[super initWithCoder:aDecoder]
方法;
2. 存儲(chǔ)
需要把對(duì)象歸檔是調(diào)用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];
需要從文件中解檔對(duì)象就調(diào)用NSKeyedUnarchiver
的一個(gè)工廠方法+ (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. 注意
- 必須遵循并實(shí)現(xiàn)NSCoding協(xié)議
- 保存文件的擴(kuò)展名可以任意指定
- 繼承時(shí)必須先調(diào)用父類的歸檔解檔方法