1、概述編碼
NSKeyedArchiver歸檔和plist文件存儲不一樣的是NSKeyedArchiver能夠直接保存對象。若是對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,能夠直接用NSKeyedArchiver進行歸檔和恢復。不是全部的對象均可以直接用這種方法進行歸檔,只有遵照了NSCoding協議的對象才能夠被存儲。code
NSCoding協議中的2個方法:對象
(1)encodeWithCoder:繼承
存對象時該方法必須實現,每次歸檔對象時,都會調用這個方法。通常在這個方法裏面指定如何歸檔對象中的每一個實例變量,能夠使用encodeObject:forKey:方法歸檔實例變量。即指定存儲哪些屬性和在文件中以什麼名字做爲key存儲這些屬性。例如:it
[encode encodeObject:_name forKey:@」name」];io
系統下次從文件中取_name的值就自動用name這個key去取,後面再經過initWithCoder方法把取出的值賦值給_name。相似地:變量
[encode encodeInt:_age forKey:@」age」];擴展
(2)initWithCoder:方法
取對象時該方法必須實現,每次從文件中恢復(解碼)對象時,都會調用這個方法。通常在這個方法裏面指定如何解碼文件中的數據爲對象的實例變量,能夠使用decodeObjectForKey方法解碼實例變量。即指定讀取文件中哪一個東西變成屬性。例如:im
-(id)initWithCoder:NSCoder *)decoder
{
if(self = [super init]){
_name = [decoder decodeObjectForKey:@」name」];
}
return self;
}
2、歸檔NSArray
歸檔一個NSArray對象到Documents/array.archive:
其中擴展名能夠任意寫,不寫也能夠。
NSArray *array = [NSArray arrayWithObjects:@」a」,@」b」,nil];
[NSKeyedArchiver archiveRootObject:array toFile:path];
歸檔成功將以下圖:
3、恢復(解碼)NSArray對象
4、歸檔對象的注意
若是父類也遵照了NSCoding協議,請注意:
(1)應該在encodeWithCoder:方法中加上一句
[super encodeWithCode:encode];
確保繼承的實例變量也能被編碼,即也能被歸檔
(2)應該在initWithCoder:方法中加上一句
self = [super initWithCoder:decoder];
確保繼承的實例變量也能被解碼,即也能被恢復