一、概念
1.歸檔用於儲存物件,包括被歸檔物件之間的各種相互關係或者依賴性。解檔用於重建以前歸檔的物件與關係。在其它物件導向的語言中,一般使用術語"序列化"來描述歸檔解檔模式。
2.歸檔的物件通常儲存為二進位制資料,可以在記憶體或者磁碟中讀取,寫入。不過在cocoa中,也有一些物件使用xml檔案進行歸檔和解檔,比如nsarray,nsdictionary等等,這是cocoa中關於歸檔解檔模式的另乙個體現。
3.實現歸檔和解檔模式的關鍵是相關物件的處理。不管物件之間的關係有多複雜,歸檔中的每個物件在那個歸檔中只會編碼一次,也就是說,如果許多歸檔的物件都引用相同的物件,則這個物件只會編碼一次,這就最小化了歸檔所需的儲存空間。
二、cocoa中的實現
1.nscoding協議:
(1)當乙個物件要實現歸檔解檔操作,需要歸檔的物件必須要實現nscoding協議。
(2)nscoding協議包含兩個方法:encodewithcoder:,initwithcoder:。
(3)encodewithcoder實現物件編碼,initwithcoder實現物件解碼。兩個方法的引數是nscoder類例項,是物件編碼解碼器,可以將例項物件的屬性直接編碼或者以key-value的方式編碼,解碼也一樣。
encodeobject:
encodeobject:forkey:
encodeint:forkey:
decodeobject
decodeobjectforkey:
decodeintforkey:
(4)編碼和解碼是物件迭代的乙個過程,可能encodeobject:objecta方法又會引起objecta的encodewithcoder被呼叫。
(5)nscoding實現示例:
- (void)encodewithcoder:(nscoder*)coder
- (id)initwithcoder:(nscoder*)decoder
self.username = [decoder decodeobjectforkey:sampledata_key_username];
self.gender = [decoder decodeboolforkey:sampledata_key_gender];
self.age = [decoder decodeintforkey:sampledata_key_age];
self.friends = [decoder decodeobjectforkey:k_friends];
self.address = [decoder decodeobjectforkey:k_address];
self.addresses = [decoder decodeobjectforkey: k_userentity_addresses];
} return self;
} 2.歸檔和解檔工具類:
nskeyedarchiver用於歸檔相關物件,生成nsdata;
nskeyedunarchiver用於解檔物件,從nsdata解碼出物件。
(1)nsdata *data = [nskeyedarchiver archiveddatawithrootobject:objecta];
nsobject *object = [nskeyedunarchiver unarchiveobjectwithdata:somedata];
(2)bool issucc = [nskeyedarchiver archiverootobject:rootobject tofile:filepath];
nsobject *object = [nskeyedunarchiver unarchiveobjectwithfile:filepath];
(3)以上兩套api方便的實現單個物件的歸檔和解檔,如果要將多個物件歸檔在一起,可以用以下api:
歸檔:nsmutabledata *data = [[nsmutabledata alloc] init];
nskeyedarchiver *archiver = [[nskeyedarchiver alloc] initforwritingwithmutabledata:data];
[archiver encodeobject:objecta forkey:@"keya"];
[archiver encodeobject:objectb forkey:@"keyb"];
[archiver encodeint:3 forkey:@"keyc"];
[archiver finishencoding];
[data writetofile:filepath atomically:yes];
[archiver release];
[data release];
解檔:– initforreadingwithdata:
– decodeobjectforkey:
finishdecoding
(4)nskeyedarchiver有乙個屬性outputformat,型別為nspropertylistformat,指定編碼器的編碼格式。有兩個可用的值:nspropertylistxmlformat_v1_0 和 nspropertylistbinaryformat_v1_0。採用二進位制的格式比採用文字的格式占用的空間小,讀寫速度高。
歸檔和解檔
針對於歸檔和解檔,在日常工作當中用的不多,但是它的原理很重要,所以有必要我們重點學習一下 歸檔是 寫入磁碟前將自定義物件轉換成二級制資料,解檔是 將磁碟上的二級制資料轉換成自定義物件 1.建立乙個person物件,寫屬性,遵守協議 在person.h檔案中 import inte ce person...
歸檔和解檔
歸檔 encoder 它是將自定義的物件寫入磁碟前將物件轉成二進位制然後存入磁碟。解檔 decoder 它是將磁碟上儲存的二進位制資料轉換成自定義物件。eg 自定義乙個person物件 h 檔案中 property nonatomic,copy nsstring name property nona...
OC 歸檔和解檔 總結
自定義物件實現協議 m 檔案內實現2個方法 例子 void encodewithcoder nscoder acoder id initwithcoder nscoder adecoder return self 歸檔自定義的型別 person tom person alloc initwithna...