資料儲存之(四) 歸檔 反歸檔

2021-07-10 10:28:13 字數 4510 閱讀 6620

nskeyedarchiver

如果物件是

nsstring

、nsdictionary

、nsarray

、nsdata

、nsnumber

等型別,

可以直接用

nskeyedarchiver

進行歸檔和恢復

不是所有的物件都可以直接用這種方法進行歸檔,只有遵守了

nscoding

協議的物件才可以

nscoding

協議有2

個方法:

encodewithcoder:

每次歸檔物件時,都會呼叫這個方法。一般在這個方法裡面指定如何歸檔物件中的每個例項變數,可以使用

encodeobject:forkey:

方法歸檔例項變數

initwithcoder:

每次從檔案中恢復(解碼

)物件時,都會呼叫這個方法。一般在這個方法裡面指定如何解碼檔案中的資料為物件的例項變數,可以使用decodeobjectforkey:

方法解碼例項變數。

例1、

•歸檔乙個

nsarray

物件到documents/array.archive

nsarray*array = [nsarray arraywithobjects:@」a」,@」b」,nil]; [

nskeyedarchiver

archiverootobject

:array

tofile

:path];

•恢復(解碼

)nsarray物件

nsarray*array = [

nskeyedunarchiver

unarchiveobjectwithfile

:path];

例2、歸檔其他物件

建立聯絡人物件,並遵守nscoding協議

#import @inte***ce contact : nsobject/** 姓名*/

@property (copy, nonatomic)nsstring *name;

/** ***/

@property (copy, nonatomic)nsstring *phone;

@end

實現協議中的方法:

#import "contact.h"

@implementation contact

/** * 如何解碼

*/- (instancetype)initwithcoder:(nscoder *)decoder

return self;

}/**

* 如何編碼

*/- (void)encodewithcoder:(nscoder *)encoder

@end

將物件歸檔並儲存值沙盒

//建立儲存路徑

#define kcontactsfile [nssearchpathfordirectoriesindomains(nsdocumentdirectory, nsuserdomainmask, yes)[0]

//進行歸檔並儲存

contact *contact = [[contact alloc] init];

contact.name = @"張三";

contact.phone = @"1314";

[nskeyedarchiver archiverootobject:contact tofile:kcontactsfile];

反歸檔:

contact *contact = [nskeyedunarchiver unarchiveobjectwithfile:kcontactsfile];
如果父類也遵守了

nscoding

協議,請注意:

應該在encodewithcoder:

方法中加上一句

[superencodewithcode:encode];

確保繼承的例項變數也能被編碼,即也能被歸檔。

應該在initwithcoder:

方法中加上一句

self= [super initwithcoder:decoder];

確保繼承的例項變數也能被解碼,即也能被恢復。

使用nsdata進行歸檔:

使用archiverootobject:tofile

:方法可以將乙個物件直接寫入到乙個檔案中,但有時候可能想將多個物件寫入到同乙個檔案中,那麼就要使用

nsdata

來進行歸檔物件。

nsdata

可以為一些資料提供臨時儲存空間,以便隨後寫入檔案,或者存放從磁碟讀取的檔案內容。可以使用

[nsmutabledata

data]

建立可變資料空間。

nsdata-歸檔

2個person

物件到同一檔案中

歸檔(編碼)

// 新建一塊可變資料區

nsmutabledata

*data = [

nsmutabledata

data]; /

/ 將資料區連線到乙個

nskeyedarchiver物件

nskeyedarchiver

*archiver = [[[

nskeyedarchiver

alloc]

initforwritingwithmutabledata

:data] autorelease]; /

/ 開始存檔物件,存檔的資料都會儲存到

nsmutabledata中

[archiver

encodeobject

:person1forkey:@"person1"]; [

archiver

encodeobject

:person2forkey:@"person2"]; /

/ 存檔完畢

(一定要呼叫這個方法)

[archiver

finishencoding];

// 將存檔的資料寫入檔案 [

data

writetofile

:path atomically:yes];

nsdata

-從同一檔案中恢復2個

person

物件恢復

(解碼)

// 從檔案中讀取資料

nsdata

*data = [nsdata

datawithcontentsoffile

:path]; /

/ 根據資料,解析成乙個

nskeyedunarchiver物件

nskeyedunarchiver

*unarchiver = [[

nskeyedunarchiver

alloc]

initforreadingwithdata

:data];

person *

person1 = [unarchiver

decodeobjectforkey

:@"person1"];

person *

person2 = [unarchiver

decodeobjectforkey

:@"person2"]; /

/ 恢復完畢 [

unarchiver

finishdecoding];

利用歸檔實現深複製

比如對乙個

person

物件進行深複製

// 臨時儲存

person1

的資料

nsdata

*data = [

nskeyedarchiver

archiveddatawithrootobject

:person1]; /

/ 解析

data

,生成乙個新的

person物件

student

*person2 = [

nskeyedunarchiver

unarchiveobjectwithdata

:data]; /

/ 分別列印記憶體位址

歸檔以及反歸檔

歸檔和反歸檔 複雜的物件我們並不能通過writetofile型別的方法寫入到檔案中。這裡的複雜物件指的是在foundation框架內部存在的資料類,這個負載物件至少包含有乙個例項物件 如果想要進行歸檔和反歸檔操作,則必須遵守 協議 我們在歸檔和解檔操作時,每乙個需要乙個鍵.並且歸檔時是什麼鍵,那麼解...

歸檔與反歸檔

建立一對.h m檔案nsobject h中遵守nscoding協議 定義屬性 在.m檔案中 反序列比 id initwithcoder nscoder adecoder return self 序列比 void encoderwithcoder nscoder acoder 在需要使用的地方 m 使...

資料持久化,歸檔,反歸檔

資料持久化的本質 將資料讀成檔案儲存在本地 沙盒機制 就是系統針對每個應用程式在本地生成的資料夾 名字隨機生成 對於不同的應用程式 不能訪問其他應用程式沙盒的內容 起到保護作用 1 documents 用來儲存長久儲存的資料 b perferences 儲存使用者的偏好設定 比如程式是否是第一次啟動...