作為iOS重要的數(shù)據(jù)持久化技術(shù)之一,相信很多人都用過(guò)NSUserDefaults ,原因無(wú)他肮柜,實(shí)在太好用了,我曾見(jiàn)過(guò)有人用它來(lái)做正向傳值的 ==七芭!
1.NSUserDefaults適合保存用戶(hù)配置信息素挽。
2.NSUserDefaults能保存的數(shù)據(jù)類(lèi)型有string、array狸驳、dictionary预明、data缩赛、url、integer撰糠、float酥馍、double、BOOL等數(shù)據(jù)類(lèi)型阅酪。
3.NSUserDefaults里的信息以plist文件存儲(chǔ)在沙盒中旨袒,具體存在/Library/Preferences中
初始化:
NSUserDefaults有四個(gè)初始化方法:一個(gè)類(lèi)方法,三個(gè)對(duì)象方法术辐。
1. + (NSUserDefaults*)standardUserDefaults;//系統(tǒng)推薦的初始化方法砚尽。
2.- (instancetype)init;//效果和standarUserDefaults一樣。
3.- (nullableinstancetype)initWithSuiteName:(nullableNSString*)suitenameNS_AVAILABLE(10_9,7_0)NS_DESIGNATED_INITIALIZER;//這個(gè)方法要傳入一個(gè)字符串辉词,待會(huì)再講
4.- (nullableid)initWithUser:(NSString*)usernameNS_DEPRECATED(10_0,10_9,2_0,7_0);//這個(gè)方法在ios7.0之后已經(jīng)被棄用了,目前這個(gè)方法貌似無(wú)用必孤。
NSUserDefaults會(huì)將開(kāi)發(fā)者存入它里面的信息以plist文件的形式寫(xiě)入到沙盒中。第一個(gè)和第二個(gè)方法初始化生成的plist文件的名稱(chēng)以這樣的規(guī)律命名:(bundle identifier).(項(xiàng)目名).plist瑞躺!
第三個(gè)方法比較有意思敷搪,它會(huì)以傳進(jìn)來(lái)的字符串xxxx為名字創(chuàng)建一個(gè)plist文件:xxxx.plist!
第四個(gè)方法不知道有沒(méi)有用幢哨,我沒(méi)試成功赡勘。
需要注意的是:在用上面的三個(gè)方法初始化成功之后,在setValue:forkey: 之前捞镰,你的/Library/Preferences中是沒(méi)有那個(gè)“應(yīng)該”出現(xiàn)的plist文件的闸与,不信的可以去使一下,就初始化曼振,但是不賦值几迄。
然后就是各種賦值和讀取的方法,太簡(jiǎn)單了冰评,不介紹。
各種有點(diǎn)難以理解的方法:
1.+ (void)resetStandardUserDefaults;
//這個(gè)方法是在第一個(gè)初始化的類(lèi)方法之后的木羹,看字面意思應(yīng)該重置userDefault(但是貌似沒(méi)起作用甲雅,有知道的求告知)
2.- (void)registerDefaults:(NSDictionary *)registrationDictionary;
//將一個(gè)指定字典的內(nèi)容添加到注冊(cè)域(應(yīng)該是NSRegistrationDomain)。如果不存在注冊(cè)域坑填,則用指定的字典創(chuàng)建一個(gè),然后NSRegistrationDomain會(huì)被添加到搜索列表(?)中抛人。注冊(cè)域中的內(nèi)容是不會(huì)寫(xiě)入到沙盒中的,你需要在程序啟動(dòng)的時(shí)候手動(dòng)調(diào)用它脐瑰,或者你可以將它寫(xiě)入到plist文件中保存起來(lái)妖枚,然后調(diào)用registerDefaults:就傳入你讀取到的文件內(nèi)容。(這里應(yīng)該是和下面系統(tǒng)默認(rèn)創(chuàng)建的兩個(gè)域一樣苍在,默認(rèn)是在內(nèi)存中的绝页。)
3.- (void)addSuiteNamed:(NSString*)suiteName;
? - (void)removeSuiteNamed:(NSString*)suiteName;
//插入一個(gè)指定的域名到接收者的搜索列表荠商。這個(gè)指定的域名類(lèi)似于bundle identifier,但不是必須和應(yīng)用包綁定的续誉。一個(gè)suite可以用來(lái)保存首選項(xiàng)莱没,進(jìn)行多個(gè)應(yīng)用之間的通信。//從接受者的搜索列表中刪除一個(gè)指定的域名酷鸦。
4.@property(readonly,copy)NSArray *volatileDomainNames;
//這個(gè)屬性返回的是不穩(wěn)定的域(這里應(yīng)該是指只存儲(chǔ)在內(nèi)存中的NSUserDefaults對(duì)象饰躲,但沒(méi)有寫(xiě)入沙盒,是程序默認(rèn)創(chuàng)建的)的名字(也就是NSUserDefaults上面公開(kāi)的三個(gè)字符串中的兩個(gè))NSArgumentDomain和NSRegistrationDomain
FOUNDATION_EXPORTNSString*const NSGlobalDomain;//這個(gè)不在arr中,就是說(shuō)這個(gè)是穩(wěn)定的?(后面也沒(méi)找到以這個(gè)命名的域)
5.- (NSDictionary *)volatileDomainForName:(NSString*)domainName;
然后利用這個(gè)方法打印上面那個(gè)volatileDomainNames臼隔,發(fā)現(xiàn)NSArgumentDomain的域里是沒(méi)有內(nèi)容的嘹裂,NSRegistrationDomain里是些系統(tǒng)配置,內(nèi)容為:
dic={
AppleLanguages = ??? (
"zh-Hans-CN",
"en-CN",
en
);
NSInterfaceStyle = macintosh;
NSLanguages = ??? (
"zh-Hans-CN",
"en-CN",
en
);
}
6.- (void)setVolatileDomain:(NSDictionary *)domain forName:(NSString*)domainName;
? - (void)removeVolatileDomainForName:(NSString*)domainName;
往下看摔握,有個(gè)數(shù)組焦蘑,返回的是穩(wěn)定的域(這里應(yīng)該是指持久化的),打印出來(lái)發(fā)現(xiàn)都是我創(chuàng)建出來(lái)的plist文件:蟹ⅰ例嘱!所以,NSUserDefaults里的域應(yīng)該是NSUserDefaults對(duì)象的存儲(chǔ)空間宁舰!下面是打印的信息:
arr=(
xxxhuaMiss,
xxxhua,
“www.pxh.com.testNSUerDefaults”,
llla
)
7.- (NSArray*)persistentDomainNamesNS_DEPRECATED(10_0,10_9,2_0,7_0);
8.- (nullableNSDictionary *)persistentDomainForName:(NSString*)domainName;
- (void)setPersistentDomain:(NSDictionary*)domain forName:(NSString*)domainName;
- (void)removePersistentDomainForName:(NSString*)domainName;
9.- (BOOL)synchronize;
//將信息同步的方法拼卵,避免因?yàn)槌绦虍惓M顺龆鴮?dǎo)致信息保存失敗的意外。
10.- (BOOL)objectIsForcedForKey:(NSString*)key;
? ? - (BOOL)objectIsForcedForKey:(NSString*)key inDomain:(NSString*)domain;