使用NSUserDefault保存對象模型

NSUserDefault可以用來保存一些系統的對象。

NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.

如果要保存自定義的對象模型要怎么辦呢?

我們把一個自定義的類存到一個NSArray里,然后再存到NSUserDefaults里也是不能成功的。

解決方法是實現<NSCoding>協議,讓這個自定義類實現協議中的? - (id) initWithCoder: (NSCoder *)coder? 和? - (void) encodeWithCoder: (NSCoder *)coder? 這兩個方法(obj-c的協議protocol就是java的接口interface,就是C++的純虛函數),然后把該自定義的類對象編碼到NSData中,再從NSUserDefaults中進行讀取。

保存:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

//不能直接存取NSObject,需要先歸檔轉成NSData

NSData * data? = [NSKeyedArchiver archivedDataWithRootObject:_User];

[defaults setObject:data forKey:KEY_User];

[defaults synchronize];

讀取:

// 讀取用戶數據

NSData * data = [[NSUserDefaults standardUserDefaults] objectForKey:KEY_User];

// 解檔

_User = [NSKeyedUnarchiver unarchiveObjectWithData:data];

實現協議的兩個方法:

// 實現NSCoding協議

- (id) initWithCoder: (NSCoder *)coder

{

if (self = [super init])

{

self.userAccount = [coder decodeObjectForKey:@"userAccount"];

self.userPassword = [coder decodeObjectForKey:@"userPassword"];

self.userName = [coder decodeObjectForKey:@"userName"];

self.userIntroduce = [coder decodeObjectForKey:@"userIntroduce"];

}

return self;

}

- (void) encodeWithCoder: (NSCoder *)coder

{

[coder encodeObject:_userAccount forKey:@"userAccount"];

[coder encodeObject:_userPassword forKey:@"userPassword"];

[coder encodeObject:_userName forKey:@"userName"];

[coder encodeObject:_userIntroduce forKey:@"userIntroduce"];

}


最后介紹一個字典模型互轉框架 MJExtension

用法可參考:https://my.oschina.net/wolx/blog/396925

github地址:github.com/CoderMJLee/MJExtension

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容