概述:
NSUserDefaults,官網(wǎng)上的定義是一個用戶默認數(shù)據(jù)庫的接口,在應(yīng)用程序的啟動過程中,持久地存儲鍵值對。每個應(yīng)用都有一個(也只有一個)NSUserDefaults對象。向NSUserDefaults類發(fā)送standardUserDefaults消息可以得到該對象。使用時需要通過鍵來存取其保存的對象。此外,當(dāng)應(yīng)用第一次使用NSUserDefaults對象時,這個對象會自動地從特定文件讀取數(shù)據(jù);修改數(shù)據(jù)后,該對象也會自動地將數(shù)據(jù)寫入文件。
NSUserDefaults支持的類型:
NSUserDefaults是一個單例,它可以用于數(shù)據(jù)的永久存儲,適合存儲輕量級的本地數(shù)據(jù)。通過NSUserDefaults對象存取數(shù)據(jù)時,使用的鍵必須是NSString對象,一個鍵對應(yīng)一項設(shè)置(preference)。存取的對象必須是對象或者基本類型的數(shù)值。如果是對象,則必須是可序列化的(serializable)對象。通過NSUserDefaults類,知道NSUserDefaults支持的類型有NSString、NSData、NSNumber、NSDate、NSArray and NSDictionary。值得注意的是,NSUserDefaults 存儲的對象全是不可變的(這一點非常關(guān)鍵,弄錯的話程序會出bug),例如,如果想要存儲一個NSMutableArray對象,則必須先創(chuàng)建一個不可變數(shù)組(NSArray)再將它存入NSUserDefaults中去。
鍵的命名約定:
應(yīng)用名+設(shè)置名稱+單詞PrefKey
存儲路徑:
NSUserDefaults對象默認會將數(shù)據(jù)存入Library/Preferences目錄,文件名就是程序包標(biāo)識(bundle identifier),文件后綴是plist。當(dāng)應(yīng)用第一次調(diào)用NSUserDefaults類的standardUserDefaults方法時,NSUserDefaults會載入上述文件,讓應(yīng)用可以使用之前保存的所有設(shè)置。
NSUserDefaults的域:
UserDefaults數(shù)據(jù)庫中其實是由多個層級的域組成的,當(dāng)你讀取一個鍵值的數(shù)據(jù)時,NSUserDefaults從上到下透過域的層級尋找正確的值,不同的域有不同的功能,有些域是可持久的,有些域則不行。默認包含五個Domain,如下:
1、參數(shù)域( argument domain)有最高優(yōu)先權(quán)
2、應(yīng)用域(application domain)是最重要的域,它存儲著你app通過NSUserDefaults set...forKey添加的設(shè)置
3、全局域(global domain)則存儲著系統(tǒng)的設(shè)置
4、語言域(language-specific domains)則包括地區(qū)、日期等
5、注冊域(registration domain)僅有較低的優(yōu)先權(quán),只有在應(yīng)用域沒有找到值時才從注冊域去尋找
例如,當(dāng)某個界面是第一次運行時,這時的key值(鍵)所對應(yīng)的值還不存在,所以NSUserDefaults對象會使用默認值為0。但是對于某些設(shè)置,可能需要臨時的、非0的默認值(如"出廠設(shè)置"),否則應(yīng)用將無法正確的運行。一般默認值都是存放于注冊域中。默認情況下,應(yīng)用域是空的,沒有鍵也沒有值。當(dāng)用戶第一次修改某個設(shè)置時,相應(yīng)的值會通過指定的鍵加入應(yīng)用域。當(dāng)通過NSUserDefaults對象獲取某個設(shè)置的值時,該對象先會在應(yīng)用域查找,如果沒有,NSUserDefaults則會在注冊域中查找并返回默認值。查詢順序:參數(shù)域 -> 應(yīng)用域 -> 全局域 -> 語言域 ->注冊域。
方法:
1、獲取標(biāo)準(zhǔn)用戶默認對象
standardUserDefaults
返回配置為搜索當(dāng)前應(yīng)用程序搜索列表的NSUserDefaults的全局實例
2、創(chuàng)建用戶默認對象
- (instancetype)init;
用應(yīng)用程序和當(dāng)前用戶的默認值初始化用戶默認對象
- (nullableinstancetype)initWithSuiteName:(nullableNSString*)suitenameAPI_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0))NS_DESIGNATED_INITIALIZER;用指定數(shù)據(jù)庫名稱的默認值初始化用戶默認對象
3、獲取默認值
- (nullableid)objectForKey:(NSString*)defaultName;
返回與指定鍵關(guān)聯(lián)的對象
- (nullableNSString*)stringForKey:(NSString*)defaultName;
返回與指定鍵關(guān)聯(lián)的字符串
- (nullableNSArray*)arrayForKey:(NSString*)defaultName;
返回與指定鍵關(guān)聯(lián)的數(shù)組
- (nullableNSDictionary?*)dictionaryForKey:(NSString*)defaultName;
返回與指定鍵關(guān)聯(lián)的字典對象
- (nullableNSData*)dataForKey:(NSString*)defaultName;
返回與指定鍵關(guān)聯(lián)的數(shù)據(jù)對象
- (nullableNSArray?*)stringArrayForKey:(NSString*)defaultName;
等效于-objectForKey
- (NSInteger)integerForKey:(NSString*)defaultName;
返回與指定鍵關(guān)聯(lián)的整數(shù)值
- (float)floatForKey:(NSString*)defaultName;
返回與指定鍵關(guān)聯(lián)的單精度浮點值
- (double)doubleForKey:(NSString*)defaultName;
返回與指定鍵關(guān)聯(lián)的雙精度浮點值
- (BOOL)boolForKey:(NSString*)defaultName;
返回與指定鍵關(guān)聯(lián)的布爾值
- (nullableNSURL*)URLForKey:(NSString*)defaultNameAPI_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
返回與指定鍵關(guān)聯(lián)的URL
dictionaryRepresentation
返回包含搜索列表中域中所有鍵值對的聯(lián)合的字典
4、設(shè)置默認值
- (void)setObject:(nullableid)value forKey:(NSString*)defaultName;
設(shè)置指定的默認鍵的值,value為要存儲的對象,defaultName為指定的鍵
- (void)setInteger:(NSInteger)value forKey:(NSString*)defaultName;
設(shè)置指定的默認鍵的值,value為要存儲的整數(shù)值,defaultName為指定的鍵
- (void)setFloat:(float)value forKey:(NSString*)defaultName;
設(shè)置指定的默認鍵的值,value為要存儲的單精度浮點值,defaultName為指定的鍵
- (void)setDouble:(double)value forKey:(NSString*)defaultName;
設(shè)置指定的默認鍵的值,value為要存儲的雙精度浮點值,defaultName為指定的鍵
- (void)setBool:(BOOL)value forKey:(NSString*)defaultName;
設(shè)置指定的默認鍵的值,value為要存儲的布爾值,defaultName為指定的鍵
- (void)setURL:(nullableNSURL*)url forKey:(NSString*)defaultNameAPI_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
設(shè)置指定的默認鍵的值,url為要存儲的URL,defaultName為指定的鍵
5、移除默認值
- (void)removeObjectForKey:(NSString*)defaultName;
移除指定的默認鍵的值
6、維護套間
- (void)addSuiteNamed:(NSString*)suiteName;
將指定的域名插入到接收方的搜索列表中
- (void)removeSuiteNamed:(NSString*)suiteName;
從接收器的搜索列表中移除指定的域名
7、注冊默認值
- (void)registerDefaults:(NSDictionary?*)registrationDictionary;
將指定字典的內(nèi)容添加到注冊域
8、維護持久域
- (NSArray*)persistentDomainNames API_DEPRECATED("Not recommended", macos(10.0,10.9), ios(2.0,7.0), watchos(2.0,2.0), tvos(9.0,9.0));
返回當(dāng)前持久域名的數(shù)組(不推薦使用)
- (nullableNSDictionary?*)persistentDomainForName:(NSString*)domainName;返回指定域默認值的字典表示形式
- (void)setPersistentDomain:(NSDictionary?*)domain forName:(NSString*)domainName;
為指定的持久域設(shè)置字典
- (void)removePersistentDomainForName:(NSString*)domainName;
從用戶的默認值中移除指定的持久域的內(nèi)容
9、維護易失性域
volatileDomainNames
易失性域名
- (NSDictionary?*)volatileDomainForName:(NSString*)domainName;
返回指定的易失性域的字典
- (void)setVolatileDomain:(NSDictionary?*)domain forName:(NSString*)domainName;
為指定的易失性域設(shè)置字典
- (void)removeVolatileDomainForName:(NSString*)domainName;
從用戶的默認值中移除指定的易失性域
10、訪問托管環(huán)境密鑰
- (BOOL)objectIsForcedForKey:(NSString*)key;
返回一個布爾值,該值指示指定密鑰是否由管理員管理
- (BOOL)objectIsForcedForKey:(NSString*)key inDomain:(NSString*)domain;
返回一個布爾值,該值指示指定域中的密鑰是否由管理員管理
11、域
NSString * const NSGlobalDomain
由所有應(yīng)用程序所看到的默認值組成的域(全局域)
NSString * const NSArgumentDomain;
從應(yīng)用程序的參數(shù)解析默認值組成的域(參數(shù)域)
NSString * const NSRegistrationDomain;
由一組臨時缺省值組成的域,其值可以由應(yīng)用程序設(shè)置,以確保搜索始終是成功的(注冊域)
12、通知
NSUserDefaultsSizeLimitExceededNotification
當(dāng)用戶默認數(shù)據(jù)中存儲更多數(shù)據(jù)時
NSUbiquitousUserDefaultsNoCloudAccountNotification
當(dāng)設(shè)置了云默認時,但沒有登錄iCloud用戶
NSUbiquitousUserDefaultsDidChangeAccountsNotification
當(dāng)用戶更改主iCloud帳戶時
NSUbiquitousUserDefaultsCompletedInitialSyncNotification
發(fā)布時,默認完成下載數(shù)據(jù),無論是第一次設(shè)備連接到一個iCloud帳戶,或當(dāng)用戶切換他們的主要iCloud帳戶
NSUserDefaultsDidChangeNotification
在當(dāng)前進程中更改用戶默認值時發(fā)布
13、遺棄的方法
+ (void)resetStandardUserDefaults;
釋放標(biāo)準(zhǔn)用戶默認值并將其設(shè)置為零(不推薦使用)
- (nullableid)initWithUser:(NSString*)usernameAPI_DEPRECATED("Use -init instead", macos(10.0,10.9), ios(2.0,7.0), watchos(2.0,2.0), tvos(9.0,9.0));
用應(yīng)用程序和當(dāng)前用戶的默認值初始化用戶默認對象,相當(dāng)于- (instancetype)init方法(不推薦使用)
- (BOOL)synchronize;
等待默認數(shù)據(jù)庫的任何掛起的異步更新并返回(不推薦使用)
14、遺棄的鍵值
日期和時間信息:
FOUNDATION_EXPORT NSString * const NSAMPMDesignation NS_DEPRECATED(10_0, 10_5, NA, NA);
用于指定打印上午和下午指定名稱的值的鍵,它影響使用%P格式說明符的字符串
FOUNDATION_EXPORT NSString * const NSDateFormatString NS_DEPRECATED(10_0, 10_5, NA, NA);
格式化字符串的鍵,它指定如何使用日期格式說明符打印日期
FOUNDATION_EXPORT NSString * const NSDateTimeOrdering NS_DEPRECATED(10_0, 10_5, NA, NA);
字符串中指定如何在日期字符串中使用模糊數(shù)的鍵
FOUNDATION_EXPORT NSString * const NSEarlierTimeDesignations NS_DEPRECATED(10_0, 10_5, NA, NA);
表示過去時間的字符串?dāng)?shù)組的鍵
FOUNDATION_EXPORT NSString * const NSHourNameDesignations NS_DEPRECATED(10_0, 10_5, NA, NA);
識別時間的字符串的鍵
FOUNDATION_EXPORT NSString * const NSLaterTimeDesignations NS_DEPRECATED(10_0, 10_5, NA, NA);
表示未來時間的字符串?dāng)?shù)組的鍵
FOUNDATION_EXPORT NSString * const NSMonthNameArray NS_DEPRECATED(10_0, 10_5, NA, NA);
用于指定月份名稱的值的鍵,它影響使用%B格式說明符的字符串
FOUNDATION_EXPORT NSString * const NSNextDayDesignations NS_DEPRECATED(10_0, 10_5, NA, NA);
表示今天后一天的字符串?dāng)?shù)組的鍵
FOUNDATION_EXPORT NSString * const NSNextNextDayDesignations NS_DEPRECATED(10_0, 10_5, NA, NA);
表示后天的字符串?dāng)?shù)組的鍵
FOUNDATION_EXPORT NSString * const NSPriorDayDesignations NS_DEPRECATED(10_0, 10_5, NA, NA);
表示今天前一天的字符串?dāng)?shù)組的鍵
FOUNDATION_EXPORT NSString * const NSShortDateFormatString NS_DEPRECATED(10_0, 10_5, NA, NA);
用于指定日期縮寫的格式字符串的鍵
FOUNDATION_EXPORT NSString * const NSShortWeekDayNameArray NS_DEPRECATED(10_0, 10_5, NA, NA);
一個字符串?dāng)?shù)組的鍵,它指定一周中的縮寫,影響使用%A格式說明符的字符串
FOUNDATION_EXPORT NSString * const NSShortMonthNameArray NS_DEPRECATED(10_0, 10_5, NA, NA);
用于指定月份的縮寫的字符串?dāng)?shù)組的鍵,它影響使用%B格式說明符的字符串
FOUNDATION_EXPORT NSString * const NSShortTimeDateFormatString NS_DEPRECATED(10_0, 10_5, NA, NA);
用于指定時間和日期縮寫的格式字符串的鍵
FOUNDATION_EXPORT NSString * const NSThisDayDesignations NS_DEPRECATED(10_0, 10_5, NA, NA);
一個字符串?dāng)?shù)組的鍵,它指定了這一天的名稱
FOUNDATION_EXPORT NSString * const NSTimeDateFormatString NS_DEPRECATED(10_0, 10_5, NA, NA);
用于指定如何打印日期的值的鍵,它影響使用格式說明符%c、%x或%x的字符串
FOUNDATION_EXPORT NSString * const NSTimeFormatString NS_DEPRECATED(10_0, 10_5, NA, NA);
用于指定打印日期的格式字符串的鍵
FOUNDATION_EXPORT NSString * const NSWeekDayNameArray NS_DEPRECATED(10_0, 10_5, NA, NA);
用于指定星期數(shù)名稱的字符串?dāng)?shù)組的鍵,它影響使用%A格式說明符的字符串
FOUNDATION_EXPORT NSString * const NSYearMonthWeekDesignations NS_DEPRECATED(10_0, 10_5, NA, NA);
一個字符串?dāng)?shù)組的鍵,它指定當(dāng)前區(qū)域中的月份、月份和星期的單詞
數(shù)值信息:
FOUNDATION_EXPORT NSString * const NSCurrencySymbol NS_DEPRECATED(10_0, 10_5, NA, NA);
指定用于表示該語言中貨幣的符號的字符串
FOUNDATION_EXPORT NSString * const NSDecimalSeparator NS_DEPRECATED(10_0, 10_5, NA, NA);
指定小數(shù)分隔符的字符串
FOUNDATION_EXPORT NSString * const NSThousandsSeparator NS_DEPRECATED(10_0, 10_5, NA, NA);
為十進制數(shù)的數(shù)千個位置指定分隔符的字符串
FOUNDATION_EXPORT NSString * const NSDecimalDigits NS_DEPRECATED(10_0, 10_5, NA, NA);
字符串,它標(biāo)識除了或代替ASCII數(shù)字的小數(shù)位數(shù)
FOUNDATION_EXPORT NSString * const NSInternationalCurrencyString NS_DEPRECATED(10_0, 10_5, NA, NA);
遵循ISO 4217標(biāo)準(zhǔn)的包含三個字母縮寫的字符串
FOUNDATION_EXPORT NSString * const NSPositiveCurrencyFormatString NS_DEPRECATED(10_0, 10_5, NA, NA);
指定貨幣值時如何打印正數(shù)的格式字符串
FOUNDATION_EXPORT NSString * const NSNegativeCurrencyFormatString NS_DEPRECATED(10_0, 10_5, NA, NA);
指定表示貨幣值時如何打印負數(shù)的格式字符串
案例:
//獲取NSUserDefaults對象
NSUserDefaults?*defaults =?[NSUserDefaults?standardUserDefaults];
//設(shè)置指定的默認鍵的值,TestMapTypePrefKey為指定的鍵??
1、設(shè)置指定的默認鍵的值
[defaults?setObject:字符型?forKey:@"TestMapTypePrefKey"];??
2、整數(shù)值存儲
[defaults?setInteger:?整數(shù)值?forKey:@"TestMapTypePrefKey"];?
3、單精度浮點值存儲
[defaults?setFloat:?單精度浮點值?forKey:@"TestMapTypePrefKey"];??
4、雙精度浮點值存儲
[defaults?setDouble: 雙精度浮點值?forKey:@"TestMapTypePrefKey"];??
5、布爾值存儲
[defaults?setBool:?布爾值?forKey:@"TestMapTypePrefKey"];??
6、URL存儲
[defaults?setURL:?NSURL值?forKey:@"TestMapTypePrefKey"];
//同步存儲(不建議使用)
[[NSUserDefaults standardUserDefaults] synchronize];
//獲取鍵值
1、返回與指定鍵關(guān)聯(lián)的對象(ReturnType可以是NSDictionary、NSString等)
ReturnType *defaults = [[NSUserDefaults standardUserDefaults] objectForKey:@"TestMapTypePrefKey"];
2、返回與指定鍵關(guān)聯(lián)的字符串
NSString *defaults?= [[NSUserDefaults standardUserDefaults] stringForKey:@"TestMapTypePrefKey"];
3、返回與指定鍵關(guān)聯(lián)的數(shù)組
NSArray *defaults?= [[NSUserDefaults standardUserDefaults]?arrayForKey:@"TestMapTypePrefKey"];
4、返回與指定鍵關(guān)聯(lián)的字典對象
NSDictionary?*defaults?= [[NSUserDefaults standardUserDefaults]?dictionaryForKey:@"TestMapTypePrefKey"];
5、返回與指定鍵關(guān)聯(lián)的數(shù)據(jù)對象
NSData?*defaults?= [[NSUserDefaults standardUserDefaults]?dataForKey:@"TestMapTypePrefKey"];
6、返回與指定鍵關(guān)聯(lián)的整數(shù)值
NSInteger defaults?= [[NSUserDefaults standardUserDefaults]?integerForKey:@"TestMapTypePrefKey"];
7、返回與指定鍵關(guān)聯(lián)的單精度浮點值
float?defaults?= [[NSUserDefaults standardUserDefaults]?floatForKey:@"TestMapTypePrefKey"];
8、返回與指定鍵關(guān)聯(lián)的雙精度浮點值
double?defaults?= [[NSUserDefaults standardUserDefaults]?doubleForKey:@"TestMapTypePrefKey"];
9、返回與指定鍵關(guān)聯(lián)的布爾值
BOOL?defaults?= [[NSUserDefaults standardUserDefaults]?boolForKey:@"TestMapTypePrefKey"];
10、返回與指定鍵關(guān)聯(lián)的URL
NSURL *defaults?= [[NSUserDefaults standardUserDefaults]?URLForKey:@"TestMapTypePrefKey"];
11、返回包含搜索列表中域中所有鍵值對的聯(lián)合的字典
NSDictionary*?defaults?=?[[NSUserDefaults?standardUserDefaults]?dictionaryRepresentation];?
//移除鍵值
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"TestMapTypePrefKey"];
以上是對NSUserDefaults的一點整理,若有不對,請各位大神指正。