userDefaults是用來儲存一些信息量較小的數(shù)據(jù)的地方搂赋,根據(jù)key來定所要存取的內(nèi)容瞧捌。userDefaults可以存的數(shù)據(jù)類型有:NSArray, NSData, NSDictionary, NSMutableDictionary, NSString,NSURL完箩。
當(dāng)我們有一些自定義的對象需要儲存時我們?nèi)ナ褂胾serDefaults發(fā)現(xiàn)會崩潰:
Attempt to set a non-property-list object
Property list invalid for format: 200 (property lists cannot contain objects of type 'CFType')
告訴我們這是一個非屬性列表里的對象是無效的泄私,我們自定義的這個對象不屬于上述數(shù)據(jù)類型粥烁,如果我們用數(shù)據(jù)庫或其他的去存取相對來說會比較復(fù)雜沒有userDefaults使用起來簡單方便棚瘟。
一、userDefaults的基本用法
userDefaults儲存的時候數(shù)組是不可變的府树,就算你存進去的是可變數(shù)組俐末,當(dāng)你在取出來的時候也是一個不可變數(shù)組,所以這點大家要注意奄侠。
所存內(nèi)容的key是唯一的卓箫,相同的key存進去會覆蓋相同key的內(nèi)容。
NSUserDefaults是一個單例垄潮,在整個程序中只有一個實例對象烹卒,他可以用于數(shù)據(jù)的永久保存闷盔,而且簡單實用,這是它可以讓數(shù)據(jù)自由傳遞的一個前提旅急,也是大家喜歡用它保存簡單數(shù)據(jù)的一個主要原因逢勾。
-
儲存BOOL類型
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];//初始化對象
[userDetaults setObject:@(YES) forKey:@"MyBOOL"];
[userDetaults synchronize];//取出 BOOL myBool = [[[NSUserDefaults standardUserDefaults] objectForKey:@"MyBOOL"]boolValue];
-
其他類型
//相對應(yīng)的key取出相對應(yīng)的值,我們可以將它封裝一下
+ (void)setData:(NSData /所要儲存的數(shù)據(jù)類型*/)data forKey:(NSString *)key{
NSUserDefaults *userDetaults = [NSUserDefaults standardUserDefaults];
[userDetaults setObject:data forKey:key];//key是自己命名的字符串
[userDetaults synchronize];
}+ (NSData */*所存的數(shù)據(jù)類型*/)dataForKey:(NSString *)key{ return [[NSUserDefaults standardUserDefaults] objectForKey:key]; }
二藐吮、儲存自定義的對象
我有這樣一個類溺拱,現(xiàn)在我想要把這個類的對象存到userDefaults里面。
首先大家看這里:
添加之后我們回到.m在.m里添加如下方法:
//自定義對象轉(zhuǎn)換NSData
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.musicImageName forKey:@"musicImageName"];
[aCoder encodeObject:self.musicName forKey:@"musicName"];
[aCoder encodeObject:self.albumName forKey:@"albumName"];
[aCoder encodeObject:self.filename forKey:@"filename"];
[aCoder encodeObject:self.singer forKey:@"singer"];
[aCoder encodeObject:self.singerIcon forKey:@"singerIcon"];
[aCoder encodeBool:self.playing forKey:@"playing"];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.musicImageName = [aDecoder decodeObjectForKey:@"musicImageName"];
self.musicName = [aDecoder decodeObjectForKey:@"musicName"];
self.albumName = [aDecoder decodeObjectForKey:@"albumName"];
self.filename = [aDecoder decodeObjectForKey:@"filename"];
self.singer = [aDecoder decodeObjectForKey:@"singer"];
self.singerIcon = [aDecoder decodeObjectForKey:@"singerIcon"];
self.playing = [aDecoder decodeBoolForKey:@"playing"];
}
return self;
}
這樣我們就把我們自定義的類轉(zhuǎn)換為data型了谣辞。
對于不同類型的轉(zhuǎn)換:
自定義對象的存取
//單獨存一個自定義對象
MPMusicInfoModel *model = [[MPMusicInfoModel alloc] init];
model.musicName = @"空白格";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model];
NSUserDefaults *userDetaults = [NSUserDefaults standardUserDefaults];
[userDetaults setObject:data forKey:@"myMusic"];
[userDetaults synchronize];
//取出
NSData *Data = [[NSUserDefaults standardUserDefaults] objectForKey:@"myMusic"];
MPMusicInfoModel *model = [NSKeyedUnarchiver unarchiveObjectWithData:data];
//存很多自定義對象迫摔。方法與存單個相同,但是要把對象放到數(shù)組里面然后在存進去
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dataArray];//dataArray里面存的是MPMusicInfoModel類的對象泥从。
NSUserDefaults *userDetaults = [NSUserDefaults standardUserDefaults];
[userDetaults setObject:data forKey:@"myMusicModelArray"];
[userDetaults synchronize];
NSData *Data = [[NSUserDefaults standardUserDefaults] objectForKey:@"myMusicModelArray"];
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data];
userDefaults基本上是這樣使用句占,如果還有更詳細(xì)的還望多多指教。