iOS userDefaults 儲(chǔ)存自定義對(duì)象序列化

iOS userDefaults 儲(chǔ)存自定義對(duì)象序列化

userDefaults是用來儲(chǔ)存一些信息量較小的數(shù)據(jù)的地方,根據(jù)key來定所要存取的內(nèi)容。userDefaults可以存的數(shù)據(jù)類型有:NSArray,

NSData, NSDictionary, NSMutableDictionary, NSString,NSURL。

當(dāng)我們有一些自定義的對(duì)象需要儲(chǔ)存時(shí)我們?nèi)ナ褂胾serDefaults發(fā)現(xiàn)會(huì)崩潰:

Attempt to set a non-property-list object

Property list invalid for format: 200 (property lists cannot contain objects of type 'CFType')

告訴我們這是一個(gè)非屬性列表里的對(duì)象是無效的,我們自定義的這個(gè)對(duì)象不屬于上述數(shù)據(jù)類型,如果我們用數(shù)據(jù)庫(kù)或其他的去存取相對(duì)來說會(huì)比較復(fù)雜沒有userDefaults使用起來簡(jiǎn)單方便。

一、userDefaults的基本用法

userDefaults儲(chǔ)存的時(shí)候數(shù)組是不可變的,就算你存進(jìn)去的是可變數(shù)組,當(dāng)你在取出來的時(shí)候也是一個(gè)不可變數(shù)組,所以這點(diǎn)大家要注意。

所存內(nèi)容的key是唯一的,相同的key存進(jìn)去會(huì)覆蓋相同key的內(nèi)容。

NSUserDefaults是一個(gè)單例,在整個(gè)程序中只有一個(gè)實(shí)例對(duì)象,他可以用于數(shù)據(jù)的永久保存,而且簡(jiǎn)單實(shí)用,這是它可以讓數(shù)據(jù)自由傳遞的一個(gè)前提,也是大家喜歡用它保存簡(jiǎn)單數(shù)據(jù)的一個(gè)主要原因。

儲(chǔ)存BOOL類型

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];//初始化對(duì)象

[userDetaults setObject:@(YES) forKey:@"MyBOOL"];

[userDetaults synchronize];

//取出

BOOL myBool = [[[NSUserDefaults standardUserDefaults] objectForKey:@"MyBOOL"]boolValue];

其他類型

//相對(duì)應(yīng)的key取出相對(duì)應(yīng)的值,我們可以將它封裝一下

+ (void)setData:(NSData/所要儲(chǔ)存的數(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];

}

二、儲(chǔ)存自定義的對(duì)象

? ? 我的類的.h文件


我有這樣一個(gè)類,現(xiàn)在我想要把這個(gè)類的對(duì)象存到userDefaults里面。

首先大家看這里:

? ? 添加<NSCoding>


添加之后我們回到.m在.m里添加如下方法:

//自定義對(duì)象轉(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型了。

對(duì)于不同類型的轉(zhuǎn)換:

? ? 不同類型的轉(zhuǎn)換


自定義對(duì)象的存取

? //單獨(dú)存一個(gè)自定義對(duì)象

? 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];

? //存很多自定義對(duì)象。方法與存單個(gè)相同,但是要把對(duì)象放到數(shù)組里面然后在存進(jìn)去

? NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dataArray];//dataArray里面存的是MPMusicInfoModel類的對(duì)象。

? NSUserDefaults *userDetaults = [NSUserDefaults standardUserDefaults];

? [userDetaults setObject:data forKey:@"myMusicModelArray"];

? [userDetaults synchronize];

? NSData *Data = [[NSUserDefaults standardUserDefaults] objectForKey:@"myMusicModelArray"];

? NSArray *array? = [NSKeyedUnarchiver unarchiveObjectWithData:data];

userDefaults基本上是這樣使用,如果還有更詳細(xì)的還望多多指教。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容