1. 程式人生 > >NSUserDefaults簡介及使用

NSUserDefaults簡介及使用

NSUserDefaults
NSUserDefaults類提供了一個與預設系統進行互動的程式設計介面。NSUserDefaults物件是用來儲存,恢復應用程式相關的偏好設定,配置資料等等。預設系統允許應用程式自定義它的行為去迎合使用者的喜好。你可以在程式執行的時候從使用者預設的資料庫中讀取程式的設定。同時NSUserDefaults的快取避免了在每次讀取資料時候都開啟使用者預設資料庫的操作。可以通過呼叫synchronize方法來使記憶體中的快取與使用者預設系統進行同步。
NSUserDefaults類提供了非常方便的方法來獲取常用的型別,例如floats,doubles,intergers,Booleans,URLs。所以一個NSUserDefaults的物件必須是屬性表,這也就是說我們可以儲存NSData,NSString,NSNUmber,NSDate,NSArray,NSDictionary這些例項。如果你想儲存其他型別的物件,你要將其歸檔並建立一個NSData來實現儲存。
從NSUserDefaults返回的值是不可改變的,即便是你在儲存的時候使用的是可變的值。例如你使用mutable string做為“MyStringDefault”的值,當你做使用stringForKey:方法獲取的值,這個值仍然是不可變的。
NSUserDefaults是單例,同時也是執行緒安全的
在使用NSUserDefaults的時候,
先看下下面的程式碼
NSDictionary* defaults = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
NSLog(@"Defaults: %@", defaults);
是用來獲取裝置上的所有的NSUserDefaults的設定。
上面程式碼輸出了
Defaults: {
    AppleITunesStoreItemKinds =     (
        eBook,
        document,
        "software-update",
        booklet,
        "itunes-u",
        newsstand,
        artist,
        podcast,
        "podcast-episode",
        software
    );
    AppleKeyboards =     (
        "
[email protected]
=Pinyin;hw=US",
        "[email protected]=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的設定,例如:
NSArray *array = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleKeyboards"];
NSLog(@"Keyboards: %@", array);
會輸出
    AppleKeyboards =     (
        "
[email protected]
=Pinyin;hw=US",
        "[email protected]=US;sw=QWERTY"
    );
在看下面的程式碼
if([[NSUserDefaults standardUserDefaults] objectForKey:@"message"]==nil){
          [[NSUserDefaults standardUserDefaults] setObject:@"This_is_my_default_message" forKey:@"message"];
}
程式碼意思是判斷NSUserDefaults的“message”key 在dictionaryRepresentation中是否存在,如果不存在就
設定“message”key為This_is_my_default_message。
在加上句[[NSUserDefaults standardUserDefaults] synchronize];,這樣這個設定就存到預設引數中了。


也見過別人把預設引數的設定寫到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中註冊和不寫到裡面效果是一樣的,只是程式碼的優美問題。