用來獲取設備上的所有的NSUserDefaults的設置。
NSDictionary* defaults = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
NSLog(@"Defaults: %@", defaults);
一、存儲位置
Library/Preference:
iOS系統(tǒng)是以一個.plist文件來統(tǒng)一管理這些使用NSUserDefaults保存的key-value的
我們可以驗證一下:在代碼當中執(zhí)行NSHomeDirectory()并打印,復制,然后在Finder->前往->前往文件夾中粘貼前往,或者才終端中執(zhí)行"cd 剛才復制的路徑"->"open ."來前往所在沙盒路徑。其中NSUserDefaults就保存在/Library/Preference
中的plist文件。
二、存取方式
存:
- setObject:forKey:
- setFloat:forKey:
- setDouble:forKey:
- setInteger:forKey:
- setBool:forKey:
- setURL:forKey:
取:
- objectForKey:
- URLForKey:
- arrayForKey:
- dictionaryForKey:
- stringForKey:
- stringArrayForKey:
- dataForKey:
- boolForKey:
- integerForKey:
- floatForKey:
- doubleForKey:
- dictionaryRepresentation
移除方式:
- removeObjectForKey:
/**
數(shù)據(jù)寫入沙盒的Library/Preference下,建議只保存應用的所有偏好設置
@param obj obj
@param key Key
*/
+ (void)userDefaultSetObjectWithObj:(id)obj
key:(NSString *)key
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:obj forKey:key];
// 同步數(shù)據(jù)
[userDefaults synchronize];
}
/**
數(shù)據(jù)讀取
@param key Key
@return value
*/
+ (id)userDefaultGainObjectWithKey:(NSString *)key
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
id value = [userDefaults objectForKey:key];
return value;
}
三、支持的數(shù)據(jù)類型
支持的數(shù)據(jù)類型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat
等系統(tǒng)定義的數(shù)據(jù)類型,如果要存放其他數(shù)據(jù)類型或者自定義的對象(如自定義的類對象),則必須將其轉換成NSData存儲。即使對象是NSArray或NSDictionary,他們存儲的類型也應該是以上范圍包括的。
在進行自定義對象的歸檔時需要實現(xiàn)NSCoding協(xié)議,不實現(xiàn)協(xié)議方法則拋出異常,類似于序列化與反序列話,獲得的對象都是不一致的。
NSUserDefaults返回的值是不可改變的,即使存儲的時候是可變的值。
對相同的Key賦值約等于一次覆蓋。
四、其他注意
1.NSUserDefaults是定時把緩存中的數(shù)據(jù)寫入磁盤的,而不是即時寫入,為了防止在寫完NSUserDefaults后程序退出導致的數(shù)據(jù)丟失,可以在寫入數(shù)據(jù)后使用synchronize強制立即將數(shù)據(jù)寫入磁盤:[userDefault synchronize];
2.數(shù)據(jù)是明文存儲在 plist 文件中,不安全,即使只是修改一個 key 都會 load 整個文件,數(shù)據(jù)多加載慢(IO 內(nèi)存),不適合存儲大量數(shù)據(jù)。
它是單例的,也是線程安全的,是以鍵值對 key-value 的形式保存在沙盒中
userDefault過大對啟動時間的影響是指數(shù)性的,所以值得關注。
解決:每次操作userDefault,都把userDefault中不相干的key 清理。