關於NSUserDefaults的祕密

weixin_33797791發表於2018-12-04

關於NSUserDefaults的祕密

   NSUserDefaults 簡介

  在日常開發中經常遇到本地儲存,儲存的方式有很多,今天我們就來看看NSUserDefaults,NSUserDefaults是一個輕量級的本地化儲存的一個類。可以用它來儲存一些偏好設定,其儲存路徑為Library/Preferences。注意這個儲存並沒有加密,so。

 NSUserDefaults常用的方法

  NSUserDefaults常用的方法,使用和NSMutableDictionary的一些方法類似。如下,看不懂的請自行百度

3810628-5a4e60ae21d0e35f.gif

3810628-9105b4723b1cf466.gif

  呼叫set的方法後,如果需要馬上同步需要synchronize方法。注意這個方法不要太頻繁呼叫。如果不呼叫synchronize,系統會每個一個時間段自動儲存。

  NSUserDefaults高階用法

儲存自定義物件

  NSUserDefaults只支援基本資料型別,如果需要儲存自定義的物件,就需要藉助NSKeyedArchiver將物件歸檔成NSData,然後再用[useDefault setObject: forKey:];方法儲存

3810628-8720caef67e7ff1e.gif

3810628-1b91b88bfa542d10.gif

3810628-c37226d5eb97154c.gif

3810628-4d37b33ccfaa1bc3.gif

  2.資料共享 

app group 中的資料共享,至於怎麼新建group,參考https://onevcat.com/2014/08/notification-today-widget/,基本的思路如下

  這裡就能解釋,同一個公司的app,裝了一個之後,在裝另一個,就會自動登入的功能。initWithSuiteName會在Library/Preference下新建一個以name為名字的plist檔案。[NSUserDefaults standardUserDefaults]是以bundle id為名字的一個plist檔案。利用這個我們可以給每一個使用者新建一個偏好設定的檔案,儲存皮膚,字型等,不同的使用者登入就會有不同的效果。

NSUserDefaults資料清除

  - (void)removePersistentDomainForName:(NSString *)domainName;清除domain下的所有資訊。在這裡要說一下NSUserDefaults的域,預設包含5個domain,分別是NSArgumentDomain,Application,NSGlobalDomain,Languages,NSRegistrationDomain。

NSUserDefaults注意的地方

當我們獲取偏好設定的值的時候,需要注意,比如如下:[stand boolForKey:@"key1"];如果沒有對應的key1則獲取的值為預設值false。這種情況就有可能和有對應的key,並且對應的值為false時,區分不開,造成的邏輯錯誤。類似的還有[stand integerForKey:@""]等。

  對應的解決辦法是:

3810628-ed4e17a9fff37c3d.gif

3810628-ee4e21ce34181788.gif

相關文章