iOS userDefaults 儲存自定義對象序列化

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

二藐吮、儲存自定義的對象

我的類的.h文件

我有這樣一個類溺拱,現(xiàn)在我想要把這個類的對象存到userDefaults里面。
首先大家看這里:

添加<NSCoding>

添加之后我們回到.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)換:

不同類型的轉(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ì)的還望多多指教。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末歉闰,一起剝皮案震驚了整個濱河市辖众,隨后出現(xiàn)的幾起案子卓起,更是在濱河造成了極大的恐慌和敬,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戏阅,死亡現(xiàn)場離奇詭異昼弟,居然都是意外死亡,警方通過查閱死者的電腦和手機奕筐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門舱痘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人离赫,你說我怎么就攤上這事芭逝。” “怎么了渊胸?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵旬盯,是天一觀的道長。 經(jīng)常有香客問我翎猛,道長胖翰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任切厘,我火速辦了婚禮萨咳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疫稿。我一直安慰自己培他,他們只是感情好鹃两,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舀凛,像睡著了一般怔毛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腾降,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天拣度,我揣著相機與錄音,去河邊找鬼螃壤。 笑死抗果,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奸晴。 我是一名探鬼主播冤馏,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寄啼!你這毒婦竟也來了逮光?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤墩划,失蹤者是張志新(化名)和其女友劉穎涕刚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乙帮,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡杜漠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了察净。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驾茴。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氢卡,靈堂內(nèi)的尸體忽然破棺而出锈至,到底是詐尸還是另有隱情,我是刑警寧澤译秦,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布峡捡,位于F島的核電站,受9級特大地震影響诀浪,放射性物質(zhì)發(fā)生泄漏棋返。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一雷猪、第九天 我趴在偏房一處隱蔽的房頂上張望睛竣。 院中可真熱鬧,春花似錦求摇、人聲如沸射沟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽验夯。三九已至猖吴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挥转,已是汗流浹背海蔽。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绑谣,地道東北人党窜。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像借宵,于是被迫代替她去往敵國和親幌衣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容