iOS開發之數據存儲之NSKeyedArchiver

1、概述編碼

NSKeyedArchiver歸檔和plist文件存儲不一樣的是NSKeyedArchiver能夠直接保存對象。若是對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,能夠直接用NSKeyedArchiver進行歸檔和恢復。不是全部的對象均可以直接用這種方法進行歸檔,只有遵照了NSCoding協議的對象才能夠被存儲。code

NSCoding協議中的2個方法:對象

1encodeWithCoder:繼承

存對象時該方法必須實現,每次歸檔對象時,都會調用這個方法。通常在這個方法裏面指定如何歸檔對象中的每一個實例變量,能夠使用encodeObject:forKey:方法歸檔實例變量。即指定存儲哪些屬性和在文件中以什麼名字做爲key存儲這些屬性。例如:it

[encode  encodeObject:_name  forKey:@」name」];io

系統下次從文件中取_name的值就自動用name這個key去取,後面再經過initWithCoder方法把取出的值賦值給_name。相似地:變量

[encode  encodeInt:_age  forKey:@」age」];擴展

2initWithCoder:方法

取對象時該方法必須實現,每次從文件中恢復(解碼)對象時,都會調用這個方法。通常在這個方法裏面指定如何解碼文件中的數據爲對象的實例變量,能夠使用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];

確保繼承的實例變量也能被解碼,即也能被恢復

相關文章
相關標籤/搜索