作為iOS重要的數據持久化技術之一,相信很多人都用過NSUserDefaults ,原因無他,實在太好用了,我曾見過有人用它來做正向傳值的 ==!
1.NSUserDefaults適合保存用戶配置信息。
2.NSUserDefaults能保存的數據類型有string、array、dictionary、data、url、integer、float、double、BOOL等數據類型。
3.NSUserDefaults里的信息以plist文件存儲在沙盒中,具體存在/Library/Preferences中
初始化:
NSUserDefaults有四個初始化方法:一個類方法,三個對象方法。
1. + (NSUserDefaults*)standardUserDefaults;//系統推薦的初始化方法。
2.- (instancetype)init;//效果和standarUserDefaults一樣。
3.- (nullableinstancetype)initWithSuiteName:(nullableNSString*)suitenameNS_AVAILABLE(10_9,7_0)NS_DESIGNATED_INITIALIZER;//這個方法要傳入一個字符串,待會再講
4.- (nullableid)initWithUser:(NSString*)usernameNS_DEPRECATED(10_0,10_9,2_0,7_0);//這個方法在ios7.0之后已經被棄用了,目前這個方法貌似無用。
NSUserDefaults會將開發者存入它里面的信息以plist文件的形式寫入到沙盒中。第一個和第二個方法初始化生成的plist文件的名稱以這樣的規律命名:(bundle identifier).(項目名).plist!
第三個方法比較有意思,它會以傳進來的字符串xxxx為名字創建一個plist文件:xxxx.plist!
第四個方法不知道有沒有用,我沒試成功。
需要注意的是:在用上面的三個方法初始化成功之后,在setValue:forkey: 之前,你的/Library/Preferences中是沒有那個“應該”出現的plist文件的,不信的可以去使一下,就初始化,但是不賦值。
然后就是各種賦值和讀取的方法,太簡單了,不介紹。
各種有點難以理解的方法:
1.+ (void)resetStandardUserDefaults;
//這個方法是在第一個初始化的類方法之后的,看字面意思應該重置userDefault(但是貌似沒起作用,有知道的求告知)
2.- (void)registerDefaults:(NSDictionary *)registrationDictionary;
//將一個指定字典的內容添加到注冊域(應該是NSRegistrationDomain)。如果不存在注冊域,則用指定的字典創建一個,然后NSRegistrationDomain會被添加到搜索列表(?)中。注冊域中的內容是不會寫入到沙盒中的,你需要在程序啟動的時候手動調用它,或者你可以將它寫入到plist文件中保存起來,然后調用registerDefaults:就傳入你讀取到的文件內容。(這里應該是和下面系統默認創建的兩個域一樣,默認是在內存中的。)
3.- (void)addSuiteNamed:(NSString*)suiteName;
? - (void)removeSuiteNamed:(NSString*)suiteName;
//插入一個指定的域名到接收者的搜索列表。這個指定的域名類似于bundle identifier,但不是必須和應用包綁定的。一個suite可以用來保存首選項,進行多個應用之間的通信。//從接受者的搜索列表中刪除一個指定的域名。
4.@property(readonly,copy)NSArray *volatileDomainNames;
//這個屬性返回的是不穩定的域(這里應該是指只存儲在內存中的NSUserDefaults對象,但沒有寫入沙盒,是程序默認創建的)的名字(也就是NSUserDefaults上面公開的三個字符串中的兩個)NSArgumentDomain和NSRegistrationDomain
FOUNDATION_EXPORTNSString*const NSGlobalDomain;//這個不在arr中,就是說這個是穩定的?(后面也沒找到以這個命名的域)
5.- (NSDictionary *)volatileDomainForName:(NSString*)domainName;
然后利用這個方法打印上面那個volatileDomainNames,發現NSArgumentDomain的域里是沒有內容的,NSRegistrationDomain里是些系統配置,內容為:
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;
往下看,有個數組,返回的是穩定的域(這里應該是指持久化的),打印出來發現都是我創建出來的plist文件!!所以,NSUserDefaults里的域應該是NSUserDefaults對象的存儲空間!下面是打印的信息:
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;
//將信息同步的方法,避免因為程序異常退出而導致信息保存失敗的意外。
10.- (BOOL)objectIsForcedForKey:(NSString*)key;
? ? - (BOOL)objectIsForcedForKey:(NSString*)key inDomain:(NSString*)domain;