iOS開發筆記之十八 歸檔Archiver(一)

2021-06-26 04:15:05 字數 3638 閱讀 8289



在程式設計開發中,經常需要用某種格式來儲存乙個或多個物件,以便以後還原這些物件。這個過程包括將(多個)物件寫入檔案中,以便以後讀取該物件。本次筆記記錄將學習兩種歸檔資料的方法:屬性列表和帶鍵值的編碼。

1、使用xml屬性列表進行歸檔

如果你的物件是nsstring、nsdictionary、nsarray、nsdata或者nsnumber型別,你可以使用使用這些類中實現的writetofile:automically:方法將資料寫入檔案中,在寫出某個字典或陣列的情況下,該方法可以使用xml屬性列表的格式寫出資料。如下**示例:

#import int main(int argc,constchar * argv)

}return0;

}

writetofile

:atomically

:第二個引數設為yes,表示希望首先將字典寫入臨時備份檔案中,並且一旦成功,將把最終資料轉移到名為personinfo的指定檔案中。這是一種安全措施,它保護一些情況下(如系統在執行操作的過程中崩潰時)免受破壞,在這種情況下,原始的personinfo檔案(如果已經存在)不會受到傷害。開啟personinfo檔案,它的內容如下:

<?xml version="1.0" encoding="utf-8"?>

liming

he is a doctor, 30 years old...

liulan

he is a teacher, 40 years old...

wanghua

he is a student, 20 years old...

從所建立的xml檔案可以看到,是以一種鍵值對的形式將字典寫入檔案的。

如果要將xml屬性列表讀入你的程式,使用dictionarywithcontentsoffile:或者arraywithcontentsoffile:方法。  要讀取資料,使用datawithcontentsoffile:方法,讀取字串物件,使用stringwithcontentoffile:方法。**如下:

nsdictionary *personinfo = [nsdictionarydictionarywithcontentsoffile:@"/users/lizita0/desktop/personinfo"];

for(nsstring *keyin personinfo)

nslog(@"%@: %@",key,[personinfoobjectforkey:key]);

輸出結果如下:

2014-10-06 12:20:44.518 archivertest[3172:303] liming: he is a doctor, 30 years old...

2014-10-06 12:20:44.521 archivertest[3172:303] liulan: he is a teacher, 40 years old...

2014-10-06 12:20:44.522 archivertest[3172:303] wanghua: he is a student, 20 years old...

mac os x上的應用程式使用xml屬性列表(或plists)儲存諸如預設引數選擇、應用程式設定和配置資訊這樣的資料,但是,歸檔用途是有限的,因為當為某個資料結構建立屬性列表時,並沒有儲存特定的物件類,也沒有儲存對同一物件的多個引用,同樣,也咩有保持物件的可變性。

2、使用nskeyedarchiver歸檔

若要將各種型別的物件儲存到檔案中,而且不僅僅是字串、陣列和字典型別,有一種更加靈活的方法,就是利用nskeyedarchiver類建立帶鍵的檔案來完成。如下**所示,使用nskeyedarchiver類中的archiverootobject

:tofile

:方法將personinfo物件儲存到磁碟中。

//將物件資料進行歸檔

nsdictionary *personinfo =

[nsdictionary dictionarywithobjectsandkeys:

@"he is a doctor, 30 years old...",

@"liming",

@"he is a student, 20 years old...",

@"wanghua",

@"he is a teacher, 40 years old...",

@"liulan",

nil];[nskeyedarchiver archiverootobject:personinfo tofile:@"/users/litao/desktop/personinfo.archive"];//將歸檔檔案讀入執行程式中,以及執行讀取後顯示的結果

nsdictionary *personinfo3 =

[nskeyedunarchiverunarchiveobjectwithfile:@"/users/litao/desktop/personinfo.archive"];

for(nsstring *keyin personinfo3)

nslog(@"%@: %@",key ,[personinfo3objectforkey: key]);

2014-10-06 15:41:04.733 archivertest[3394:303] wanghua: he is a student, 20 years old...

2014-10-06 15:41:04.736 archivertest[3394:303] liming: he is a doctor, 30 years old...

2014-10-06 15:41:04.737 archivertest[3394:303] liulan: he is a teacher, 40 years old...

3、編碼方法和解碼方法

對於基本的objective-c類,可以使用encodeobjective:forkey:方法,對於基本的c資料型別(如整型和浮點型),可以使用以下方法:

編碼方法:encodebool:forkey:  解碼方法:decodebool:forkey:

編碼方法:encodeint:forkey:  解碼方法:decodeint:forkey:

編碼方法:encodeint32:forkey:  解碼方法:decodeint32:forkey:

編碼方法:encodeint64:forkey:  解碼方法:decodeint64:forkey:

編碼方法:encodefloat:forkey:  解碼方法:decodefloat:forkey:

編碼方法:encodedoule:forkey:  解碼方法:decode

double

:forkey:

但是要歸檔你定義的複雜物件,還需要告知系統如何歸檔(或編碼)你的物件,以及如何解歸檔(或解碼)它們。按照協議,在你的類定義中新增encodewithcoder:方法和initwithcoder:方法實現的。每次歸檔程式想要根據指定的類編碼物件時,都將呼叫encodewithcoder:方法,該方法告知歸檔程式如何進行歸檔。同樣的,每次從指定的類解碼物件時,都會呼叫initwithcoder:方法。

iOS開發筆記

1.預設快取策略下 useprotocolcachepolicy 對於靜態資源的訪問,請求頭會自動帶上 if none match if modified since 快取方面,響應頭帶有 last modified etag 兩個字段 儘管charles抓包結果為304,但是 urlsession...

iOS開發之歸檔

歸檔是一種物件都可以實現的更加常規的序列化方式。適用對模型物件進行歸檔的技術可以輕鬆將複雜物件寫入檔案和從檔案中進行讀取。大多數支援儲存資料的foundation和cocos touch類都遵循nscoding協議 不過有些例外,例如uiiamge 因此對於大多數系統提供的類而言,歸檔比較輕鬆。如果...

iOS開發筆記之工具篇

工欲善其事,必先利其器。作為乙個合格的ios開發者,熟練的使用各種開發或輔助開發的工具也算是一項必備技能吧,下面是我整理的一些工具及其應用場景和使用方法。charles wireshark github sourcetree cornerstone sqlitebrowser datum alloc...