**如下:
[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
- (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
- (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...