iOSSharing #8 | 2019-05-12

本期爲 NSUserDefaults 內容

目錄

1. NSUserDefaults 可以存儲哪些類型的數據?能夠存儲可變數據類型嗎?能夠存儲自定義數據類型嗎?

2. NSUserDefaults 沒有存儲 key 的時候默認返回什麼?

3. NSUserDefaults 存取操做是什麼?它將數據存在何處?而且它是如何保持數據一致性的?

4. NSUserDefaults 舊數據總能被新設置的替換嗎?

5. NSUserDefaults 性能如何?

1. NSUserDefaults 可以存儲哪些類型的數據?能夠存儲可變數據類型嗎?能夠存儲自定義數據類型嗎?

(1)可存儲的數據類型

  • NSNumber(NSInteger、float、double、bool)
  • NSString
  • NSDate
  • NSData
  • NSArray
  • NSDictionary

(2)能夠,可是取出來是不可變類型

能夠將可變數據類型存入,可是取出來的時候,數據類型會變成不可變shell

(3)不能夠

自定義數據類型, 例如自定義模型, 須要先轉成 NSData 類型才能存儲數據庫

2. NSUserDefaults 沒有存儲 key 的時候默認返回什麼?

  • 當獲取對象時,默認返回nil
  • 當獲取數字時,默認返回0
  • 當獲取bool類型時,默認返回false

3. NSUserDefaults 存取操做是什麼?它將數據存在何處?而且它是如何保持數據一致性的?

(1)存取方式

//存
[[NSUserDefaults standardUserDefaults] setObject:value forKey:@"key"];
複製代碼
//取
id value = [[NSUserDefaults standardUserDefaults] objectForKey:@"key"];
複製代碼
//強制同步數據
[[NSUserDefaults standardUserDefaults] synchronize];
複製代碼

關於 NSUserDefaults, 官方文檔有這麼一段話:緩存

At runtime, you use NSUserDefaults objects to read the defaults that your app uses from a user’s defaults database. NSUserDefaults caches the information to avoid having to open the user’s defaults database each time you need a default value. When you set a default value, it’s changed synchronously within your process, and asynchronously to persistent storage and other processes.app

NSUserDefaults 會將訪問到的 key 和 value 緩存到內存中, 下次訪問時, 若是緩存中命中這個 key, 就直接訪問, 若是沒有命中, 再從文件中載入, 會時不時調用 synchronize 來保證數據的一致性, 可是這個操做非實時的, 爲了防止數據丟失, 咱們應該在對重要的數據保存時使用synchornize方法強制寫入, 但也不要過於頻繁, 畢竟頻繁訪問數據庫影響性能async

(2)存儲位置

// 沙盒下
AppData/Library/Preferences/Bundle\ Identifier.plist
複製代碼

4. NSUserDefaults 舊數據總能被新設置的替換嗎?

並不必定, 在使用 `registerDefaults` 來註冊默認時, 舊值不必定被替換

官方註釋:性能

adds the registrationDictionary to the last item in every search list. This means that after NSUserDefaults has looked for a value in every other valid location, it will look in registered defaults, making them useful as a "fallback" value. Registered defaults are never stored between runs of an application, and are visible only to the application that registers them. Default values from Defaults Configuration Files will automatically be registered.ui

大體是說, 當應用內沒有這個值時, 這個值將做爲默認值存在, 若是這個 key 已經存在, 那麼這個值將做爲備用, 而且當 app 再次啓動, 這個默認值並不會替換已經存在的值, 咱們用幾行代碼來講明spa

  1. 首先
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys: @"blue", @"color", nil];   
    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];  
   
    return YES;
}  
複製代碼
  1. 當 app 第一次 run 時, NSUserDefaults 會把 @"color" = @"blue" 寫入 plist 中, 而後好比在 app 內調用了
[[NSUserDefaults standardUserDefaults] setObject:@"red" forKey:@"color"];  
複製代碼

這時 NSUserDefaults 裏 @"color" = @"red"code

  1. 退出 app, 殺掉後臺, 第1步裏的 registerDefaults 仍是會被調用, 但它會查到 @"color" key 已存在, 並不會把 @"blue" 寫進去
  2. registerDefaults 修改成
NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys: @"black", @"color",@"tomson", @"username",nil];   
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues]; 
複製代碼

這時, NSUserDefaults 內 @"color" 依然爲 @"red", 但多了 @"username" = @"tomson"orm

5. NSUserDefaults 性能如何?

從性能上分析, 緩存的機制帶來了必定的性能提高, 經過一些網上的文章瞭解到在10萬個key的狀況下, 經過NSUserDefaults來讀取value是1ms級別的, 然而當你從plist文件中直接讀取, 須要100ms的級別開銷, 可是寫是個相反的結果, 要是你寫1個10萬條數據到plist文件中是1s級別的開銷,而同時寫入10萬條NSUserDefaults鍵值對則須要10s級別的延遲. 咱們都知道在建立key/value時, 程序須要在內存中也建立一個相應的映射關係, 而後系統會時不時調用synchronsize方法同步數據, 不少的方法會致使建立key/value pair被阻塞

總的來講, 使用NSUserDefaults是比較高效的, 可是不能大量的將數據經過 NSUserDefaults 中

相關文章
相關標籤/搜索