概述:
NSUserDefaults,官網(wǎng)上的定義是一個用戶默認(rèn)數(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對象默認(rèn)會將數(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從上到下透過域的層級尋找正確的值摧玫,不同的域有不同的功能,有些域是可持久的绑青,有些域則不行席赂。默認(rèn)包含五個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對象會使用默認(rèn)值為0烦味。但是對于某些設(shè)置,可能需要臨時的壁拉、非0的默認(rèn)值(如"出廠設(shè)置")谬俄,否則應(yīng)用將無法正確的運行。一般默認(rèn)值都是存放于注冊域中弃理。默認(rèn)情況下溃论,應(yīng)用域是空的,沒有鍵也沒有值痘昌。當(dāng)用戶第一次修改某個設(shè)置時钥勋,相應(yīng)的值會通過指定的鍵加入應(yīng)用域。當(dāng)通過NSUserDefaults對象獲取某個設(shè)置的值時辆苔,該對象先會在應(yīng)用域查找算灸,如果沒有,NSUserDefaults則會在注冊域中查找并返回默認(rèn)值驻啤。查詢順序:參數(shù)域 -> 應(yīng)用域 -> 全局域 -> 語言域 ->注冊域菲驴。
方法:
1、獲取標(biāo)準(zhǔn)用戶默認(rèn)對象
standardUserDefaults
返回配置為搜索當(dāng)前應(yīng)用程序搜索列表的NSUserDefaults的全局實例
2街佑、創(chuàng)建用戶默認(rèn)對象
- (instancetype)init;
用應(yīng)用程序和當(dāng)前用戶的默認(rèn)值初始化用戶默認(rèn)對象
- (nullableinstancetype)initWithSuiteName:(nullableNSString*)suitenameAPI_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0))NS_DESIGNATED_INITIALIZER;用指定數(shù)據(jù)庫名稱的默認(rèn)值初始化用戶默認(rèn)對象
3谢翎、獲取默認(rèn)值
- (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è)置默認(rèn)值
- (void)setObject:(nullableid)value forKey:(NSString*)defaultName;
設(shè)置指定的默認(rèn)鍵的值沐旨,value為要存儲的對象森逮,defaultName為指定的鍵
- (void)setInteger:(NSInteger)value forKey:(NSString*)defaultName;
設(shè)置指定的默認(rèn)鍵的值,value為要存儲的整數(shù)值磁携,defaultName為指定的鍵
- (void)setFloat:(float)value forKey:(NSString*)defaultName;
設(shè)置指定的默認(rèn)鍵的值褒侧,value為要存儲的單精度浮點值,defaultName為指定的鍵
- (void)setDouble:(double)value forKey:(NSString*)defaultName;
設(shè)置指定的默認(rèn)鍵的值,value為要存儲的雙精度浮點值闷供,defaultName為指定的鍵
- (void)setBool:(BOOL)value forKey:(NSString*)defaultName;
設(shè)置指定的默認(rèn)鍵的值烟央,value為要存儲的布爾值,defaultName為指定的鍵
- (void)setURL:(nullableNSURL*)url forKey:(NSString*)defaultNameAPI_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
設(shè)置指定的默認(rèn)鍵的值歪脏,url為要存儲的URL疑俭,defaultName為指定的鍵
5、移除默認(rèn)值
- (void)removeObjectForKey:(NSString*)defaultName;
移除指定的默認(rèn)鍵的值
6婿失、維護(hù)套間
- (void)addSuiteNamed:(NSString*)suiteName;
將指定的域名插入到接收方的搜索列表中
- (void)removeSuiteNamed:(NSString*)suiteName;
從接收器的搜索列表中移除指定的域名
7钞艇、注冊默認(rèn)值
- (void)registerDefaults:(NSDictionary?*)registrationDictionary;
將指定字典的內(nèi)容添加到注冊域
8、維護(hù)持久域
- (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;返回指定域默認(rèn)值的字典表示形式
- (void)setPersistentDomain:(NSDictionary?*)domain forName:(NSString*)domainName;
為指定的持久域設(shè)置字典
- (void)removePersistentDomainForName:(NSString*)domainName;
從用戶的默認(rèn)值中移除指定的持久域的內(nèi)容
9豪硅、維護(hù)易失性域
volatileDomainNames
易失性域名
- (NSDictionary?*)volatileDomainForName:(NSString*)domainName;
返回指定的易失性域的字典
- (void)setVolatileDomain:(NSDictionary?*)domain forName:(NSString*)domainName;
為指定的易失性域設(shè)置字典
- (void)removeVolatileDomainForName:(NSString*)domainName;
從用戶的默認(rèn)值中移除指定的易失性域
10哩照、訪問托管環(huán)境密鑰
- (BOOL)objectIsForcedForKey:(NSString*)key;
返回一個布爾值,該值指示指定密鑰是否由管理員管理
- (BOOL)objectIsForcedForKey:(NSString*)key inDomain:(NSString*)domain;
返回一個布爾值懒浮,該值指示指定域中的密鑰是否由管理員管理
11飘弧、域
NSString * const NSGlobalDomain
由所有應(yīng)用程序所看到的默認(rèn)值組成的域(全局域)
NSString * const NSArgumentDomain;
從應(yīng)用程序的參數(shù)解析默認(rèn)值組成的域(參數(shù)域)
NSString * const NSRegistrationDomain;
由一組臨時缺省值組成的域,其值可以由應(yīng)用程序設(shè)置砚著,以確保搜索始終是成功的(注冊域)
12次伶、通知
NSUserDefaultsSizeLimitExceededNotification
當(dāng)用戶默認(rèn)數(shù)據(jù)中存儲更多數(shù)據(jù)時
NSUbiquitousUserDefaultsNoCloudAccountNotification
當(dāng)設(shè)置了云默認(rèn)時,但沒有登錄iCloud用戶
NSUbiquitousUserDefaultsDidChangeAccountsNotification
當(dāng)用戶更改主iCloud帳戶時
NSUbiquitousUserDefaultsCompletedInitialSyncNotification
發(fā)布時赖草,默認(rèn)完成下載數(shù)據(jù)学少,無論是第一次設(shè)備連接到一個iCloud帳戶剪个,或當(dāng)用戶切換他們的主要iCloud帳戶
NSUserDefaultsDidChangeNotification
在當(dāng)前進(jìn)程中更改用戶默認(rèn)值時發(fā)布
13秧骑、遺棄的方法
+ (void)resetStandardUserDefaults;
釋放標(biāo)準(zhǔn)用戶默認(rè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)前用戶的默認(rèn)值初始化用戶默認(rèn)對象,相當(dāng)于- (instancetype)init方法(不推薦使用)
- (BOOL)synchronize;
等待默認(rèn)數(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);
為十進(jìn)制數(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);
指定表示貨幣值時如何打印負(fù)數(shù)的格式字符串
案例:
//獲取NSUserDefaults對象
NSUserDefaults?*defaults =?[NSUserDefaults?standardUserDefaults];
//設(shè)置指定的默認(rèn)鍵的值,TestMapTypePrefKey為指定的鍵??
1、設(shè)置指定的默認(rèn)鍵的值
[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的一點整理酸纲,若有不對捣鲸,請各位大神指正。