iOS數(shù)據(jù)持久化——?dú)w檔NSKeyedArchiver(NSCoding)

前面兩種方式(plist文件讀寫(xiě)赃蛛、NSUserDefaults偏好設(shè)置)只能保存 plist 支持的基本數(shù)據(jù)類型夭谤,那么要保存自定義的類對(duì)象,蘋(píng)果提供了NSKeydeArchiver歸檔隔盛。

歸檔在iOS中是另一種形式的序列化犹菱,只要遵循了 NSCoding 協(xié)議的對(duì)象都可以通過(guò)它實(shí)現(xiàn)序列化。由于絕大多數(shù)支持存儲(chǔ)數(shù)據(jù)的類都遵循了 NSCoding 協(xié)議吮炕,因此腊脱,對(duì)于大多數(shù)類來(lái)說(shuō),歸檔相對(duì)而言還是比較容易實(shí)現(xiàn)的龙亲。

如果對(duì)象是 NSString陕凹、NSDictionary、NSArray鳄炉、NSData杜耙、NSNumber 等類型,可以直接用 NSKeyedArchiver 歸檔和 NSKeyedUnarchiver 解檔拂盯。

1佑女、遵循NSCoding協(xié)議

NSCoding 協(xié)議聲明了兩個(gè)方法,這兩個(gè)方法都是必須實(shí)現(xiàn)的:

  • encodeWithCoder:用來(lái)說(shuō)明如何將對(duì)象編碼到歸檔中谈竿。
    每次歸檔對(duì)象時(shí)团驱,都會(huì)調(diào)用這個(gè)方法。一般在這個(gè)方法里面指定如何歸檔對(duì)象中的每個(gè)實(shí)例變量空凸,可以使用 encodeObject:forKey: 方法歸檔實(shí)例變量嚎花。

  • initWithCoder:用來(lái)說(shuō)明如何進(jìn)行解檔來(lái)獲取一個(gè)新對(duì)象。
    每次從文件中恢復(fù)(解碼)對(duì)象時(shí)呀洲,都會(huì)調(diào)用這個(gè)方法紊选。一般在這個(gè)方法里面指定如何解碼文件中的數(shù)據(jù)為對(duì)象的實(shí)例變量,可以使用 decodeObject:forKey 方法解碼實(shí)例變量两嘴。

// 1.遵循NSCoding協(xié)議 
@interface Person : NSObject <NSCoding> 
// 2.設(shè)置屬性
@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) NSInteger age;
@end

@implementation Person 
// 解檔
- (id)initWithCoder:(NSCoder *)aDecoder {
      if (self = [super init]) {
          self.name = [aDecoder decodeObjectForKey:@"name"];
          self.age = [aDecoder decodeIntegerForKey:@"age"];
      }
      return self;
}
// 歸檔
- (void)encodeWithCoder:(NSCoder *)aCoder {
      [aCoder encodeObject:self.name forKey:@"name"];
      [aCoder encodeInteger:self.age forKey:@"age"];
}
@end
2丛楚、NSKeyedArchiver歸檔

調(diào)用 NSKeyedArchiverarchiveRootObject:toFile: 方法把對(duì)象歸檔。

NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).lastObject; 
NSString *file = [path stringByAppendingPathComponent:@"person.data"];
Person *person = [[Person alloc] init];
person.name = @"Jay";
person.age = 18;
[NSKeyedArchiver archiveRootObject:person toFile:file];
3憔辫、NSKeyedUnarchiver解檔

調(diào)用 NSKeyedUnarchiverunarchiveObjectWithFile: 方法從文件中解檔對(duì)象趣些。

NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).lastObject; 
NSString *file = [path stringByAppendingPathComponent:@"person.data"];
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
if (person) {
    self.nameLable.text = person.name;
    self.ageLable.text = [NSString stringWithFormat:@"%ld", person.age];
}
  • 必須遵循并實(shí)現(xiàn) NSCoding 協(xié)議
  • 保存文件的擴(kuò)展名可以任意指定
  • 繼承時(shí)必須先調(diào)用父類的歸檔解檔方法,這里因?yàn)楦割愂?NSObject贰您,就不用了坏平。如果父類也遵守了 NSCoding 協(xié)議拢操,請(qǐng)注意:
    • 應(yīng)該在encodeWithCoder:方法中加上一句 [super encodeWithCode:encode] ,確保繼承的實(shí)例變量也能被編碼舶替,即也能被歸檔令境。
    • 應(yīng)該在initWithCoder:方法中加上一句 self = [super initWithCoder:decoder],確保繼承的實(shí)例變量也能被解碼顾瞪,即也能被恢復(fù)舔庶。

通過(guò)文件讀寫(xiě)(plist)保存的數(shù)據(jù)是直接顯示出來(lái)的,不安全陈醒。而通過(guò) NSKeydeArchiver 歸檔方法保存的數(shù)據(jù)在文件中打開(kāi)是編碼惕橙,更安全。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钉跷,一起剝皮案震驚了整個(gè)濱河市弥鹦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爷辙,老刑警劉巖彬坏,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膝晾,居然都是意外死亡栓始,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)血当,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)混滔,“玉大人,你說(shuō)我怎么就攤上這事歹颓。” “怎么了油湖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵巍扛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我乏德,道長(zhǎng)撤奸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任喊括,我火速辦了婚禮胧瓜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郑什。我一直安慰自己府喳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布蘑拯。 她就那樣靜靜地躺著钝满,像睡著了一般兜粘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弯蚜,一...
    開(kāi)封第一講書(shū)人閱讀 49,850評(píng)論 1 290
  • 那天孔轴,我揣著相機(jī)與錄音,去河邊找鬼碎捺。 笑死路鹰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的收厨。 我是一名探鬼主播晋柱,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帽氓!你這毒婦竟也來(lái)了趣斤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤黎休,失蹤者是張志新(化名)和其女友劉穎浓领,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體势腮,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡联贩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捎拯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泪幌。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖署照,靈堂內(nèi)的尸體忽然破棺而出祸泪,到底是詐尸還是另有隱情,我是刑警寧澤建芙,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布没隘,位于F島的核電站,受9級(jí)特大地震影響禁荸,放射性物質(zhì)發(fā)生泄漏右蒲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一赶熟、第九天 我趴在偏房一處隱蔽的房頂上張望瑰妄。 院中可真熱鬧,春花似錦映砖、人聲如沸间坐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)眶诈。三九已至涨醋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逝撬,已是汗流浹背浴骂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宪潮,地道東北人溯警。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狡相,于是被迫代替她去往敵國(guó)和親梯轻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容