能夠將可變數據類型存入,可是取出來的時候,數據類型會變成不可變shell
自定義數據類型, 例如自定義模型, 須要先轉成 NSData
類型才能存儲數據庫
nil
//存
[[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
// 沙盒下
AppData/Library/Preferences/Bundle\ Identifier.plist
複製代碼
官方註釋:性能
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
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys: @"blue", @"color", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
return YES;
}
複製代碼
[[NSUserDefaults standardUserDefaults] setObject:@"red" forKey:@"color"];
複製代碼
這時 NSUserDefaults 裏 @"color" = @"red"code
registerDefaults
仍是會被調用, 但它會查到 @"color" key 已存在, 並不會把 @"blue" 寫進去registerDefaults
修改成NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys: @"black", @"color",@"tomson", @"username",nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
複製代碼
這時, NSUserDefaults 內 @"color" 依然爲 @"red", 但多了 @"username" = @"tomson"orm
從性能上分析, 緩存的機制帶來了必定的性能提高, 經過一些網上的文章瞭解到在10萬個key的狀況下, 經過NSUserDefaults
來讀取value是1ms級別的, 然而當你從plist文件中直接讀取, 須要100ms的級別開銷, 可是寫是個相反的結果, 要是你寫1個10萬條數據到plist文件中是1s級別的開銷,而同時寫入10萬條NSUserDefaults
鍵值對則須要10s級別的延遲. 咱們都知道在建立key/value時, 程序須要在內存中也建立一個相應的映射關係, 而後系統會時不時調用synchronsize
方法同步數據, 不少的方法會致使建立key/value pair被阻塞
總的來講, 使用NSUserDefaults
是比較高效的, 可是不能大量的將數據經過 NSUserDefaults 中