1. 程式人生 > >iOS: NSUserDefaults 要注意的地方 尤其首次設定預設值的方法

iOS: NSUserDefaults 要注意的地方 尤其首次設定預設值的方法

NSUserDefaults用於儲存一些app setting。當你關閉app之後再開啟後,之前儲存的setting依然可以從NSUserDefaults裡讀取。注意:密碼最好不要儲存在NSUserDefaults裡,要儲存也必須用AES/DES加密儲存,更安全的方法是 https://github.com/ldandersen/scifihifi-iphone

example 1: 讀取NSUserDefaults裡的"color" setting

[[NSUserDefaults standardUserDefaults] stringForKey:@"color"];

example 2: 寫入NSUserDefaults裡的"color" setting為"red"
[[NSUserDefaults standardUserDefaults] setObject:@"red" forKey:@"color"];


另外NSUserDefaults還提供了一個registerDefaults方法,通常在appDelegate的didFinishLaunchingWithOptions裡呼叫

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys: @"blue", @"color",nil]; 
    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
    
    return YES;
}
registerDefaults方法呼叫時會check NSUserDefaults裡是否已經存在了相同的key,如果有則不會把其覆蓋。舉個例子:

1 當第一次run上面的app時,"color"="blue"會寫入NSUserDefaults裡

2 然後你的app呼叫了

[[NSUserDefaults standardUserDefaults] setObject:@"red" forKey:@"color"];

  這時NSUserDefaults裡"color"="red"

3. exit app and restart it,registerDefaults方法還是會被呼叫,但它check到"color" key已經存在,就不會把它寫入NSUserDefaults中

  這時NSUserDefaults裡"color"="red"

4. 修改registerDefaults方法變成

    NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys: @"black", @"color",nil]; 
    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];

  然後重新run app,之後NSUserDefaults裡依然"color"="red"

5. 修改registerDefaults方法變成

NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys: @"black", @"color",@"tomson", @"username",nil]; 
    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];

  然後重新run app,之後NSUserDefaults裡依然"color"="red",不過多了a pair of key-value:  username=tomson

注意:

* If you terminate your app by pressing "Stop" in Xcode (in the Simulator or on the device), your User Defaults might get saved

* 我沒試過NSUserDefaults在exit app之後被儲存,有人說碰到,並給出程式碼呼叫""的解決方案

ref links: