以前對NSUserDefaults的理解很淺顯动猬,只是用于存儲一些應(yīng)用內(nèi)的某些簡單的鍵值對或者存儲用戶的一些設(shè)置。比如記錄當(dāng)前應(yīng)用內(nèi)是否開啟定位表箭、是否自動登錄枣察、記錄某個事件的狀態(tài)、或者NStimer倒計時時間等簡單鍵值對燃逻。看了一些博客以及親自實踐后發(fā)現(xiàn)一些可能忽略的問題臂痕。
1.線程是否安全:
Interprocess: Preferences may be accessible to and modified from multiple processes simultaneously (for example between an application and an extension).
蘋果官方文檔中明確指出這個類是線程安全的
2.可用于鍵值的對象
存取時用到的對象不再是實現(xiàn)了NSCopying協(xié)議的任意對象就可以作為鍵值伯襟,而只能用NSString作為鍵值來存取對象。
3.如何刪除全部鍵值對
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//方法一
NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:bundleIdentifier];
//方法二
NSDictionary *dict = [userDefaults dictionaryRepresentation];
for (NSString *key in dict) {
[userDefaults removeObjectForKey:key];
}
[userDefaults synchronize];
這里需要注意的是[userDefaults dictionaryRepresentation]獲取的不僅僅是應(yīng)用的 BundleIdentifier所對應(yīng)的domain下的key-value握童,還包含NSArgumentDomain姆怪、NSGlobalDomain、NSRegistrationDomain等domain下的key-value,但是刪除的僅僅是BundleIdentifier對應(yīng)domian下的key-value
4.可變性及其效率參看參考資料
對NSUserDefaults對象發(fā)valueForKey:消息稽揭,返回的數(shù)據(jù)是不可變的俺附,盡管setValue:forKey:時傳入的可能是可變的數(shù)據(jù)對象
5.可以存儲哪些對象
僅支持NSString, NSData, NSNumber, NSDate, NSArray, and NSDictionary這幾種對象,而集合對象中也只能包含這幾種對象溪掀。
如果存入自定義對象會報類似下面的錯誤
Attempt to set a non-property-list object <NSObject: 0x608000010d40> as an NSUserDefaults/CFPreferences value for key objc
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object <NSObject: 0x608000010d40> for key objc'