NSUserDefaults詳解

概述:

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的一點整理,若有不對,請各位大神指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 歡迎關(guān)注公眾號: CodeReview 關(guān)于NSUserDefaults首先要看蘋果官方的定義 NSUserDef...
    sellse閱讀 79,432評論 16 169
  • 關(guān)于NSUserDefaults的一些原理 什么是NSUserDefaults對于應(yīng)用來說,每個用戶都有自己的獨特...
    Keizo閱讀 2,825評論 0 0
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,282評論 8 265
  • 發(fā)現(xiàn)寫博客想寫明白也是一件不容易的事情。 這次拿YYKIt 源碼 分析分析。希望這次能寫的更好些。 YYKit 系...
    充滿活力的早晨閱讀 6,815評論 4 16
  • 感受宗教的力量,上帝與科學(xué)同在!不要想象是達芬奇密碼前傳.單單就這一步來看的話就已經(jīng)非常不錯了!
    四維gz閱讀 194評論 0 0

友情鏈接更多精彩內(nèi)容