NSUserDefault可以用來保存一些系統(tǒng)的對象饺律。
NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.
如果要保存自定義的對象模型要怎么辦呢?
我們把一個自定義的類存到一個NSArray里,然后再存到NSUserDefaults里也是不能成功的喊熟。
解決方法是實(shí)現(xiàn)<NSCoding>協(xié)議息裸,讓這個自定義類實(shí)現(xiàn)協(xié)議中的? - (id) initWithCoder: (NSCoder *)coder? 和? - (void) encodeWithCoder: (NSCoder *)coder? 這兩個方法(obj-c的協(xié)議protocol就是java的接口interface疯兼,就是C++的純虛函數(shù))教馆,然后把該自定義的類對象編碼到NSData中馋缅,再從NSUserDefaults中進(jìn)行讀取。
保存:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//不能直接存取NSObject绢淀,需要先歸檔轉(zhuǎn)成NSData
NSData * data? = [NSKeyedArchiver archivedDataWithRootObject:_User];
[defaults setObject:data forKey:KEY_User];
[defaults synchronize];
讀扔┿病:
// 讀取用戶數(shù)據(jù)
NSData * data = [[NSUserDefaults standardUserDefaults] objectForKey:KEY_User];
// 解檔
_User = [NSKeyedUnarchiver unarchiveObjectWithData:data];
實(shí)現(xiàn)協(xié)議的兩個方法:
// 實(shí)現(xiàn)NSCoding協(xié)議
- (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"];
}
最后介紹一個字典模型互轉(zhuǎn)框架 MJExtension
用法可參考:https://my.oschina.net/wolx/blog/396925
github地址:github.com/CoderMJLee/MJExtension