ios做儲存的時候,陣列裡面放nsstring、nsnumber、nsdata等可以直接寫入檔案,但是我們自定義的類物件放入陣列中就不能直接寫入檔案。原因是上述的類實現了協議,該協議有兩個方法
//對物件進行歸檔的時候其實就是訪問物件的屬性
//進行編碼的時候會呼叫,做儲存操作的時候會呼叫這個方法
- (void)encodewithcoder:(nscoder *)acoder
//進行解碼的時候會呼叫,做讀取操作的時候會呼叫這個方法
- (id)initwithcoder:(nscoder *)adecoder
所以我們要想實現我們自己寫的類做本地儲存,需要做的第一件事就是宣告這個協議,再實現這個協議的方法。我們其實做儲存的時候是存這個物件的屬性的。
我們來實現一下基本的歸檔功能。
* 首先我們根據返回資料自定義乙個類
.h檔案
#import
//宣告協議,該協議是不需要設定委託的,直接宣告就行啦
@inte***ce
collectmodel : nsobject
@property(nonatomic,copy) nsstring *foodname;
@property(nonatomic,strong) uiimage *foodimage;
@property(nonatomic,copy) nsstring *foodid;
@end
@implementation
collectmodel
#pragma mark nscoding
//對物件進行歸檔的時候其實就是訪問物件的屬性
//進行編碼的時候會呼叫,做儲存操作的時候會呼叫這個方法
- (void)encodewithcoder:(nscoder *)acoder
//進行解碼的時候會呼叫,做讀取操作的時候會呼叫這個方法
- (id)initwithcoder:(nscoder *)adecoder
return
self;
}@end
collectmodel *model = [collectmodel new];
model.foodname = @"黃瓜";
model.foodid = @"1";
model.foodimage = [uiimage imagenamed:@"1"];
//(建立籃子)建立乙個可變data,用來存放歸檔的資料
nsmutabledata *mudata = [nsmutabledata new];
//(建立菜刀)建立歸檔工具並初始化他的可變data
nskeyedarchiver *archiver = [[nskeyedarchiver alloc] initforwritingwithmutabledata:mudata];
//(砍!!!!)使用歸檔工具去歸檔某個物件,此時物件實現了nscoding協議,就會呼叫的物件的encodewithcoder對物件的屬性進行歸檔
[archiver encodeobject:model forkey:@"huanggua"];
//結束歸檔操作,歸檔後的內容就存在了data中
[archiver finishencoding];
//將data寫入沙盒
//讀取沙盒中的資料nsdata *data = [nsdata datawithcontentsoffile:[nshomedirectory
//建立解歸檔工具初始化需要解歸檔的資料
nskeyedunarchiver *unarchiver = [[nskeyedunarchiver alloc] initforreadingwithdata:data];
//對物件進行解歸檔操作,此時物件實現了nscoding協議,就會呼叫initwithcoder方法去解碼物件的屬性,key可以用乙個巨集定義。
collectmodel *model = [unarchiver decodeobjectforkey:@"huanggua"];
//結束解歸檔
[unarchiver finishdecoding];
- (ibaction)collectfood:(uibutton *)sender
}nsstring *notificationstr;
if (isequal)
else
//進行一次歸檔操作,將新增了物件的arr陣列存入沙盒,新增後的檔案會覆蓋原來的檔案。
nsmutabledata *mudata = [nsmutabledata data];
nskeyedarchiver *archiver = [[nskeyedarchiver alloc] initforwritingwithmutabledata:mudata];
[archiver encodeobject:arr forkey:@"arrmodel"];
[archiver finishencoding];
//覆蓋原來的檔案
//alert輸出新增與否
uialertcontroller *alertcon = [uialertcontroller alertcontrollerwithtitle:@"提示" message:notificationstr preferredstyle:1];
uialertaction *cancelaction = [uialertaction actionwithtitle:@"取消" style:uialertactionstylecancel handler:nil];
[alertcon addaction:cancelaction];
[self presentviewcontroller:alertcon animated:yes completion:nil];
}
nskeyedunarchiver *unarchiver = [[nskeyedunarchiver alloc] initforreadingwithdata:data];
self
.dataarr = [unarchiver decodeobjectforkey:@"arrmodel"];
[unarchiver finishdecoding];
//獲取到資料重新整理表
iOS開發之APP USER物件儲存歸檔
void forgetpsdaction completion null 這個方法啊,頁面保證釋放 頁面迴圈跳轉,若有頁面不進行釋放的話則會導致迴圈引用 2.就忘記密碼和註冊頁面來看也就是相互之間可以跳轉到登入頁面去。3.一旦登入成功,這時候後台伺服器回返回乙個使用者的所有資訊的json或者其他型別...
iOS開發之歸檔
歸檔是一種物件都可以實現的更加常規的序列化方式。適用對模型物件進行歸檔的技術可以輕鬆將複雜物件寫入檔案和從檔案中進行讀取。大多數支援儲存資料的foundation和cocos touch類都遵循nscoding協議 不過有些例外,例如uiiamge 因此對於大多數系統提供的類而言,歸檔比較輕鬆。如果...
IOS開發中的歸檔與反歸檔
歸檔 是物件的 一種序列化 方式,對模型物件進 行歸檔 的技術可以輕鬆將複雜的物件寫 入 檔案,然後再從 檔案 中讀取它們。要求類中要進 行歸檔的屬性或者成員變數是基本資料類 型 如 int或 float 等 或者符合 nscoding 協議的某個類 的物件 如 nsstring 或nsarray ...