NSKeyedArchiver的基礎用法

2021-06-20 11:39:58 字數 4801 閱讀 4397

**如下:

[cpp]view plain

copy

print?

nsstring *str = @

"abc"

;  nsstring *astr = @"efg"

;  nsarray *array = [nsarray arraywithobjects:str, astr, nil];  

//儲存資料

];  

[nskeyedarchiver archiverootobject:array tofile:filename];  

str = @"a"

;  astr = @""

;  //載入資料

nsarray *arr = [nskeyedunarchiver unarchiveobjectwithfile: filename];  

str = [arr objectatindex:0];  

astr =  [arr objectatindex:1];  

nslog(@"str:%@"

,str);  

nslog(@"astr:%@"

,astr);  

下面是乙個資料持久化的應用的例項:

開發應用程式時

,有乙個很好的機會

,你會希望

有一些永續性的排序

(儲存名稱,密碼,

分數等)

。nsuserdefaults

提供了乙個

簡單的方法來安全地

儲存資訊

。然而,你

可能需要

乙個更強大的解決

方案。你的

邏輯資料

抽象不應該有符合的

永續性機制的限制

,你需要乙個

解決方案,

具有足夠的靈活性

來歸檔所有

你的物件,不

只是字串,陣列

和字典。

這就是nskeyed(un)archiver

的用武之地。這裡的

處理:我們為

運動教練建立乙個。他

需要為他的

運動員的

統計資料

歸檔/檢索

解決方案。討論

的規格後,我們

已經打破了我們

的抽象。我們有

乙個scorecard 類,

將舉行乙個

運動員的

最佳時機,和

所有的分數陣列。

我們有乙個athlete類,

包含運動員

的具體資訊,和

記分卡例項。我們

有roster類,

包含了一些

名冊的具體資訊,與

運動員例項

陣列一起

。這裡是

我們簡單的類的**

[cpp]view plain

copy

print?

// scorecard.h

#import 

@inte***ce scorecard : nsobject   

@property (copy) nsstring *besttime;  

@property (copy) nsmutablearray *alltimes;  

// other methods not relevant to this tutorial go here

@end  

@implementation scorecard  

@synthesize besttime, alltimes;  

- (id)init   

return

self;  

}  - (id)initwithcoder:(nscoder *)adecoder   

return

self;  

}  - (void

)encodewithcoder:(nscoder *)acoder   

- (void

)dealloc   

@end  

通過在類裡宣告兩個方法nitwithcoder: / encodewithcoder:,使我們的類符合nscoding協議---當然我們已經在類裡實現了這兩個方法。

當scorecard 類的物件被encoded時,必須保證它的例項變數也一起被encoded.正如你看到的,scorecard物件在[encodewithcoder:]對此進行了相應處理。

當然在 [initwithcoder:]方法裡也做了相應的解碼處理。在這裡,scorecard物件通過nscoder引數傳過來的資訊來初始化它的例項變數。這是乙個優雅的解決

辦法;我們沒有必要去關注編碼/解碼的過程,而scorecard從放進去和它的例項變數都能當成常規物件看待。

對於encode/decode方法在什麼時候會被喚醒你可能有一些疑問,那麼請看接下來我們其它物件的**,一切都會變得很明了。

[cpp]view plain

copy

print?

// athlete.h

#import 

@inte***ce athlete : nsobject   

@property (copy) nsstring *name, *bio, *phonenumber;  

@property (retain) scorecard *scorecard;  

@property (getter=iseligible) bool

eligible;  

- (void

)print;  

@end  

@implementation athlete  

@synthesize name, bio, phonenumber, scorecard, eligible;  

- (id)init   

return

self;  

}  - (id)initwithcoder:(nscoder *)adecoder   

return

self;  

}  - (void

)encodewithcoder:(nscoder *)acoder   

- (void

)print   

- (void

)dealloc   

@end  

實際上這裡沒有什麼新東西,除了新定義了乙個bool變數外。

只要注意

在我們的

編碼/解碼

的方法來處理

這種型別的

原始資料

的微小變化。

我寫了乙個

快速列印的方法

,所以我們

可以很容易地

測試程式的輸出。

同時,正如你看到的,athlete物件中包含乙個scorecard例項變數。當乙個athlete物件encoded/decoded時,scorecard例項變數也進行同樣的操作(當然所有的例項變數

都會進行這樣的操作,我特意指出scorecard例項變數只是因為它是乙個定製的物件)。

[cpp]view plain

copy

print?

// roster.h

#import 

@inte***ce roster : nsobject   

@property (retain) nsmutablearray *athletes;  

@property int

rank;  

- (void

)print;  

- (void

)addathlete:(athlete *)athlete;  

@end  

@implementation roster  

@synthesize rank, athletes;  

- (id)init   

return

self;  

}  - (id)initwithcoder:(nscoder *)adecoder   

return

self;  

}  - (void

)encodewithcoder:(nscoder *)acoder   

- (void

)addathlete:(athlete *)athlete   

- (void

)print   

- (void

)dealloc   

@end  

這裡,同樣的處理;這次我負責初始化和列印選手名字的工作。

現在執行測試.

[cpp]view plain

copy

print?

static

nsstring *names  = ;  

// function to create a roster. in real life, this wouldn't be used, but we're just testing now

roster * create()   

return

[roster autorelease];  

}  int

main (

intargc, 

char

**argv)   

程式第一次執行時,乙個roster物件被建立,填充和存檔。

去除下面幾行的注釋,你就可心從檔案裡建立乙個roster物件。

NSKeyedArchiver歸檔儲存

一 儲存普通資料 1 獲取沙盒儲存路徑 獲取沙盒儲存路徑 nsstring doc nssearchpathfordirectoriesindomains nsdocumentdirectory,nsuserdomainmask,yes lastobject 獲取儲存檔案路徑2 儲存資料 nsarr...

資料儲存 NSKeyedArchiver 一

在 ios 開發中,資料儲存的其中一種方式是將乙個物件直接存到檔案中。直接將乙個物件存到檔案要使用的類是nskeyedarchiver。而要將儲存在檔案中的物件讀取出來就要使用到另乙個類nskeyedunarchiver。這兩個類是成對出現的,但使用這兩個類儲存物件到檔案或從檔案中解析物件是有條件的...

資料持久化 NSKeyedArchiver

1.基本的資料型別如 nsstring nsdictionary nsarray nsdata nsnumber等可以直接用nskeyedarchiver歸檔和恢復。2.不是所有的物件都可以直接用這種方法歸檔,只有遵守了nscoding協議的物件才可以。3.nscoding的協議有2個方法 void...