iOS筆記之NSUserDefaults

1、NSUserDefault的使用:
作用:NSUserDefaults類提供了一個與默認系統(tǒng)進行交互的編程接口缨睡。NSUserDefaults對象是用來保存,恢復(fù)應(yīng)用程序相關(guān)的偏好設(shè)置获诈,配置數(shù)據(jù)等等救斑。默認系統(tǒng)允許應(yīng)用程序自定義它的行為去迎合用戶的喜好。你可以在程序運行的時候從用戶默認的數(shù)據(jù)庫中讀取程序的設(shè)置哗总。同時NSUserDefaults的緩存避免了在每次讀取數(shù)據(jù)時候都打開用戶默認數(shù)據(jù)庫的操作几颜。可以通過調(diào)用synchronize方法來使內(nèi)存中的緩存與用戶默認系統(tǒng)進行同步。

原理:NsUserDefault是用戶輕量級的數(shù)據(jù)持久化讯屈,主要用于保存用戶程序的配置等信息蛋哭,以便下次啟動程序后能恢復(fù)上次的設(shè)置。因為是寫到了硬盤上涮母,所以會出現(xiàn)用多了會造成系統(tǒng)浪費谆趾,內(nèi)存占用過大等問題准颓。
(1)、該數(shù)據(jù)實際上是以“鍵值對”形式保存的(類似于NSDictionary)棺妓,因此我們需要通過key來讀取或者保存數(shù)據(jù)(value)攘已。
(2)、NSUserDefaults類提供了非常方便的方法來獲取常用的類型怜跑,例如floats,doubles,intergers,Booleans,URLs样勃。所以這也就是說我們可以存儲NSData,NSString,NSNUmber,NSDate,NSArray,NSDictionary(目前有五種類型)這些實例。如果你想存儲其他類型的對象性芬,你要將其歸檔并創(chuàng)建一個NSData來實現(xiàn)存儲峡眶。
(3)、從NSUserDefaults返回的值是不可改變的植锉,即便是你在存儲的時候使用的是可變的值辫樱。例如你使用mutable string做為“MyStringDefault”的值,當你做使用stringForKey:方法獲取的值俊庇,這個值仍然是不可變的狮暑。
(4)、NSUserDefaults是單例辉饱,同時也是線程安全的

語法:
存儲整型的例子:
1搬男、獲取一個NSUserDefaults引用:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
2、保存數(shù)據(jù)

[userDefaults setInteger:1 forKey:@"segment"];
[userDefaults synchronize];

3彭沼、讀取數(shù)據(jù)
int i = [userDefaults integerForKey:@"segment"];
存儲其他數(shù)據(jù)類型的例子:
保存數(shù)據(jù):保存UIcolor類型的缔逛,超出上面的5種數(shù)據(jù)類型,就要進行歸檔姓惑,把它們歸檔成data類型的數(shù)據(jù)之后再保存褐奴。

NSData *objColor = [NSKeyedArchiver archivedDataWithRootObject:[UIColor redColor]];
[[NSUserDefaults standardUserDefaults]setObject:objColor forKey:@"myColor"];

讀取數(shù)據(jù):

NSData *objColor = [[NSUserDefaults standardUserDefaults]objectForKey:@"myColor"];

UIColor *myColor = [NSKeyedUnarchiver unarchiveObjectWithData:objColor];

2、NSUserDefault的使用小技巧:
(1)于毙、NSUserDefault保存的數(shù)據(jù)在程序沒有關(guān)閉前能成功讀取到敦冬,但是當應(yīng)用程序重啟之后,就無法讀取到望众,原因就是數(shù)據(jù)沒有即時寫入匪补。通過官方文檔可以了解到,UserDefaults是根據(jù)時間戳定時的把緩存中的數(shù)據(jù)寫入本地磁盤烂翰,而非即時寫入夯缺。所以調(diào)用set方法之后數(shù)據(jù)有可能還沒有寫入磁盤,應(yīng)用程序就已經(jīng)終止了甘耿。保險起見踊兜,我們在對重要的數(shù)據(jù)保存時使用synchornize方法強制寫入,但是也要注意佳恬,不用頻繁的使用synchornize捏境。

(2)于游、在使用NSUserDefault的時候,很多人以為:
[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"testInfo"] ;后就已經(jīng)算存儲好了垫言,再通過
[[NSUserDefaults standardUserDefaults] objectForKey:@"testInfo"];就可以取出剛剛存的數(shù)據(jù)贰剥。
其實正常情況下沒有問題,但是當重起程序筷频,關(guān)鍵字testInfo對應(yīng)的竟然是空蚌成,這是什么情況呢?

我看看NSUserDefaults的頭文件凛捏,就會發(fā)現(xiàn)担忧,其實還有另外一個方法:synchronize,數(shù)據(jù)即時寫入坯癣。

如果我們在set后瓶盛,執(zhí)行下面的語句:
[[NSUserDefaults standardUserDefaults] synchronize];
那么就不會出現(xiàn)上面的取出數(shù)據(jù)為空的情況了。

完整代碼如下:

//存入數(shù)據(jù)
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
[defaults setObject:@"111" forKey:@"t
est"];
//把數(shù)據(jù)寫到硬盤上
[defaults synchronize];
 
//取出數(shù)據(jù)
NSString *testStr =[defaults objectForKey:@"test"];
NSLog(@"testStr is: %@",testStr);

3示罗、NSUserDefault的一些實際使用:
在使用NSUserDefaults的時候惩猫,
先看下下面的代碼

NSDictionary* defaults = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
NSLog(@"Defaults: %@", defaults);

是用來獲取設(shè)備上的所有的NSUserDefaults的設(shè)置。
上面代碼輸出了

Defaults: {
    AppleITunesStoreItemKinds =     (
        eBook,
        document,
        "software-update",
        booklet,
        "itunes-u",
        newsstand,
        artist,
        podcast,
        "podcast-episode",
        software
    );
    AppleKeyboards =     (
        "zh_Hans-Pinyin@sw=Pinyin;hw=US",
        "en_US@hw=US;sw=QWERTY"
    );
    AppleKeyboardsExpanded = 1;
    AppleLanguages =     (
        "zh-Hans",
        en,
        fr,
        de,
        ja,
        nl,
        it,
        es,
        pt,
        "pt-PT",
        da,
        fi,
        nb,
        sv,
        ko,
        "zh-Hant",
        ru,
        pl,
        tr,
        uk,
        ar,
        hr,
        cs,
        el,
        he,
        ro,
        sk,
        th,
        id,
        "en-GB",
        ca,
        hu,
        vi
    );

如果想單獨看某個key的設(shè)置鹉勒,例如:

NSArray *array = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleKeyboards"];
NSLog(@"Keyboards: %@", array);

會輸出

    AppleKeyboards =     (
        "zh_Hans-Pinyin@sw=Pinyin;hw=US",
        "en_US@hw=US;sw=QWERTY"
    );

在看下面的代碼

if([[NSUserDefaults standardUserDefaults] objectForKey:@"message"]==nil){
          [[NSUserDefaults standardUserDefaults] setObject:@"This_is_my_default_message" forKey:@"message"];
}

代碼意思是判斷NSUserDefaults的“message”key 在dictionaryRepresentation中是否存在帆锋,如果不存在就
設(shè)置“message”key為This_is_my_default_message。
在加上句[[NSUserDefaults standardUserDefaults] synchronize];禽额,這樣這個設(shè)置就存到默認參數(shù)中了。

也見過別人把默認參數(shù)的設(shè)置寫到applicationDidFinishLaunching注冊的

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
     NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys:
                                   @"This_is_my_default_message", @"message",
                                   nil];
 
    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
    [[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:defaultValues];
}

當然寫到applicationDidFinishLaunching中注冊和不寫到里面效果是一樣的皮官,只是代碼的優(yōu)美問題脯倒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捺氢,隨后出現(xiàn)的幾起案子藻丢,更是在濱河造成了極大的恐慌,老刑警劉巖摄乒,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悠反,死亡現(xiàn)場離奇詭異,居然都是意外死亡馍佑,警方通過查閱死者的電腦和手機斋否,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拭荤,“玉大人茵臭,你說我怎么就攤上這事【耸溃” “怎么了旦委?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵奇徒,是天一觀的道長。 經(jīng)常有香客問我缨硝,道長摩钙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任查辩,我火速辦了婚禮腺律,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宜肉。我一直安慰自己匀钧,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布谬返。 她就那樣靜靜地躺著之斯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遣铝。 梳的紋絲不亂的頭發(fā)上佑刷,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音酿炸,去河邊找鬼瘫絮。 笑死,一個胖子當著我的面吹牛填硕,可吹牛的內(nèi)容都是我干的麦萤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼扁眯,長吁一口氣:“原來是場噩夢啊……” “哼壮莹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起姻檀,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤命满,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绣版,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胶台,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年杂抽,在試婚紗的時候發(fā)現(xiàn)自己被綠了诈唬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡默怨,死狀恐怖讯榕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤愚屁,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布济竹,位于F島的核電站,受9級特大地震影響霎槐,放射性物質(zhì)發(fā)生泄漏送浊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一丘跌、第九天 我趴在偏房一處隱蔽的房頂上張望袭景。 院中可真熱鬧,春花似錦闭树、人聲如沸耸棒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽与殃。三九已至,卻和暖如春碍现,著一層夾襖步出監(jiān)牢的瞬間幅疼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工昼接, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爽篷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓慢睡,卻偏偏與公主長得像逐工,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子一睁,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

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

  • 前言: 在程序開發(fā)中钻弄,數(shù)據(jù)層永遠是程序的核心結(jié)構(gòu)之一。對這些數(shù)據(jù)的加工處理是代碼中能體現(xiàn)技術(shù)水平的一大模塊者吁,比如數(shù)...
    麥穗0615閱讀 1,462評論 3 22
  • 1.1 談一談GCD和NSOperation的區(qū)別? 首先二者都是多線程相關(guān)的概念饲帅,當然在使用中也是根據(jù)不同情境進...
    John_LS閱讀 1,313評論 0 12
  • 27复凳、ViewController的didReceiveMemoryWarning是在什么時候調(diào)用的?默認的操作是...
    煙雨平生花飛舞閱讀 586評論 0 1
  • 前言 在iOS開發(fā)中必不可少的要用到數(shù)據(jù)存儲灶泵,數(shù)據(jù)的處理是iOS開發(fā)中的核心技術(shù)育八,適當?shù)膶?shù)據(jù)進行持久化存儲可以實...
    若小北00閱讀 8,049評論 6 28
  • 李笑來老師《通往財富自由之路》第一篇文章髓棋。別以為一上來就是教如何賺大錢的,得慢慢品。 啥叫“財富自由呢”按声? 維基百...
    凡塵花仙子閱讀 304評論 3 6