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 儲存使用者的偏好設定 比如程式是否是第一次啟動...