天天看點

iOS開發之資料存儲之NSKeyedArchiver

1、概述

nskeyedarchiver歸檔和plist檔案存儲不同的是nskeyedarchiver可以直接儲存對象。如果對象是nsstring、nsdictionary、nsarray、nsdata、nsnumber等類型,可以直接用nskeyedarchiver進行歸檔和恢複。不是所有的對象都可以直接用這種方法進行歸檔,隻有遵守了nscoding協定的對象才可以被存儲。

nscoding協定中的2個方法:

(1)encodewithcoder:

存對象時該方法必須實作,每次歸檔對象時,都會調用這個方法。一般在這個方法裡面指定如何歸檔對象中的每個執行個體變量,可以使用encodeobject:forkey:方法歸檔執行個體變量。即指定存儲哪些屬性和在檔案中以什麼名字作為key存儲這些屬性。例如:

[encode  encodeobject:_name  forkey:@”name”];

系統下次從檔案中取_name的值就自動用name這個key去取,後面再通過initwithcoder方法把取出的值指派給_name。類似地:

[encode  encodeint:_age  forkey:@”age”];

(2)initwithcoder:

取對象時該方法必須實作,每次從檔案中恢複(解碼)對象時,都會調用這個方法。一般在這個方法裡面指定如何解碼檔案中的資料為對象的執行個體變量,可以使用decodeobjectforkey方法解碼執行個體變量。即指定讀取檔案中哪個東西變成屬性。例如:

-(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];

歸檔成功将如下圖:

iOS開發之資料存儲之NSKeyedArchiver

3、恢複(解碼)nsarray對象

iOS開發之資料存儲之NSKeyedArchiver

4、歸檔對象的注意

如果父類也遵守了nscoding協定,請注意:

(1)應該在encodewithcoder:方法中加上一句

[super encodewithcode:encode];

確定繼承的執行個體變量也能被編碼,即也能被歸檔

(2)應該在initwithcoder:方法中加上一句

self = [super initwithcoder:decoder];

確定繼承的執行個體變量也能被解碼,即也能被恢複