使用NSUserDefault儲存物件模型

weixin_34353714發表於2016-12-16

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

相關文章