NSUserDefaults適合存儲輕量級的本地數(shù)據(jù)狞玛,比如要保存一個登陸界面的數(shù)據(jù)软驰,用戶名、密碼之類的心肪,個人覺得使用NSUserDefaults是首選锭亏。下次再登陸的時候就可以直接從NSUserDefaults里面讀取上次登陸的信息。
因為如果使用自己建立的plist文件什么的硬鞍,還得自己顯示創(chuàng)建文件慧瘤,讀取文件,很麻煩固该,而是用NSUserDefaults則不用管這些東西锅减,就像讀字符串一樣,直接讀取就可以了伐坏。
NSUserDefaults支持的數(shù)據(jù)格式有:NSNumber(Integer怔匣、Float、Double)桦沉,NSString每瞒,NSDate,NSArray永部,NSDictionary独泞,BOOL類型。
NSUserDefaults常用的方法
NSUserDefaults常用的方法苔埋,使用和NSMutableDictionary的一些方法類似懦砂。
//設(shè)置
- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
- (void)setFloat:(float)value forKey:(NSString *)defaultName;
- (void)setDouble:(double)value forKey:(NSString *)defaultName;
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
- (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);
- (void)setObject:(nullable id)value forKey:(NSString *)defaultName;
//獲取
- (nullable NSString *)stringForKey:(NSString *)defaultName;
- (nullable NSArray *)arrayForKey:(NSString *)defaultName;
- (nullable NSDictionary*)dictionaryForKey:(NSString *)defaultName;
- (nullable NSData *)dataForKey:(NSString *)defaultName;
- (nullable NSArray*)stringArrayForKey:(NSString *)defaultName;
- (NSInteger)integerForKey:(NSString *)defaultName;
- (float)floatForKey:(NSString *)defaultName;
- (double)doubleForKey:(NSString *)defaultName;
- (BOOL)boolForKey:(NSString *)defaultName;
- (nullable NSURL *)URLForKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);
//這里建議同步存儲到磁盤中
[userDefaults?synchronize];
調(diào)用set的方法后,如果需要馬上同步synchronize方法组橄。注意這個方法不要太頻繁調(diào)用荞膘。如果不調(diào)用synchronize,系統(tǒng)會每個一個時間段自動保存玉工。
//保存數(shù)據(jù)到NSUserDefaults
-(void)saveNSUserDefaults
{
NSString?*myString?=?@"enuola";
int?myInteger?=?100;
float?myFloat?=?50.0f;
double?myDouble?=?20.0;
NSDate?*myDate?=?[NSDate?date];
NSArray?*myArray?=?[NSArray?arrayWithObjects:@"hello",?@"world",?nil];
NSDictionary?*myDictionary?=?[NSDictionary?dictionaryWithObjects:[NSArray?arrayWithObjects:@"enuo",?@"20",?nil]?forKeys:[NSArray?arrayWithObjects:@"name",?@"age",?nil]];
//將上述數(shù)據(jù)全部存儲到NSUserDefaults中
NSUserDefaults?*userDefaults?=?[NSUserDefaults?standardUserDefaults];
//存儲時羽资,除NSNumber類型使用對應(yīng)的類型意外,其他的都是使用setObject:forKey:
[userDefaults?setInteger:myInteger?forKey:@"myInteger"];
[userDefaults?setFloat:myFloat?forKey:@"myFloat"];
[userDefaults?setDouble:myDouble?forKey:@"myDouble"];
[userDefaults?setObject:myString?forKey:@"myString"];
[userDefaults?setObject:myDate?forKey:@"myDate"];
[userDefaults?setObject:myArray?forKey:@"myArray"];
[userDefaults?setObject:myDictionary?forKey:@"myDictionary"];
//這里建議同步存儲到磁盤中遵班,但是不是必須的
[userDefaults?synchronize];
}
//從NSUserDefaults中讀取數(shù)據(jù)
-(void)readNSUserDefaults
{
NSUserDefaults?*userDefaultes?=?[NSUserDefaults?standardUserDefaults];
//讀取整型int類型的數(shù)據(jù)
NSInteger?myInteger?=?[userDefaultes?integerForKey:@"myInteger"];
//讀取浮點型float類型的數(shù)據(jù)
float?myFloat?=?[userDefaultes?floatForKey:@"myFloat"];
//讀取double類型的數(shù)據(jù)
double?myDouble?=?[userDefaultes?doubleForKey:@"myDouble"];
//讀取NSString類型的數(shù)據(jù)
NSString?*myString?=?[userDefaultes?stringForKey:@"myString"];
//讀取NSDate日期類型的數(shù)據(jù)
NSDate?*myDate?=?[userDefaultes?valueForKey:@"myDate"];
NSDateFormatter?*df?=?[[NSDateFormatter?alloc]?init];
[df?setDateFormat:@"yyyy-MM-dd?HH:mm:ss"];
txtNSDate.text?=?[NSString?stringWithFormat:@"%@",[df?stringFromDate:myDate]];
//讀取數(shù)組NSArray類型的數(shù)據(jù)
NSArray?*myArray?=?[userDefaultes?arrayForKey:@"myArray"];
NSString?*myArrayString?=?[[NSString?alloc]?init];
for(NSString?*str?in?myArray)
{
NSLog(@"str=?%@",str);
myArrayString?=?[NSString?stringWithFormat:@"%@??%@",?myArrayString,?str];
[myArrayString?stringByAppendingString:str];
//????????[myArrayString?stringByAppendingFormat:@"%@",str];
NSLog(@"myArrayString=%@",myArrayString);
}
//讀取字典類型NSDictionary類型的數(shù)據(jù)
NSDictionary?*myDictionary?=?[userDefaultes?dictionaryForKey:@"myDictionary"];
NSString?*myDicString?=?[NSString?stringWithFormat:@"name:%@,?age:%d",[myDictionary?valueForKey:@"name"],?[[myDictionary?valueForKey:@"age"]?integerValue]];
}
再次運行的時候屠升,讓程序直接讀取而不存儲數(shù)據(jù),發(fā)現(xiàn)以前保存的數(shù)據(jù)仍然可以讀取到界面上狭郑。
下面講一下原理:
你可能會問一個問題:NSUserDefautls將數(shù)據(jù)存儲在什么地方了腹暖??翰萨?我都沒有顯示的指定路徑脏答???很疑惑吧殖告。阿蝶。。黄绩。
用NSUserDefaults存儲的數(shù)據(jù)下次程序運行的時候依然存在羡洁,它把數(shù)據(jù)存儲在什么地方了?如何能夠清除宝与?
其實它存儲在應(yīng)用程序內(nèi)置的一個plist文件里焚廊,這個可以根據(jù)路徑看到。
比如說這個是你的程序沙盒位置
/UsersLibrary/Application Support/iPhoneSimulator/4.1/Applicati*****/29788E40-AF47-45A0-8E92-3AC0F501B7F4/,(這個是應(yīng)用程序?qū)?yīng)在mac上的位置)
這個下面有/Library/Prefereces习劫,里面有個plist文件咆瘟,存儲的就是你的userDefaults
想要刪掉的話,用removeObjectForKey或者刪掉沙盒诽里,也就是你的應(yīng)用程序然后重新安裝袒餐。
數(shù)據(jù)共享
//appA中
NSUserDefaults *shareDefaultA = [[NSUserDefaults alloc]initWithSuiteName:@"com.storage.demo"];
[shareDefaultA setObject:@"appA"forKey:@"shareKey"];
//appB中
NSUserDefaults *shareDefaultB = [[NSUserDefaults alloc]initWithSuiteName:@"com.storage.demo"];
NSString*value = [shareDefaultB objectForKey:@"shareKey"];
這里就能解釋,同一個公司的app谤狡,裝了一個之后灸眼,在裝另一個,就會自動登錄的功能墓懂。initWithSuiteName會在Library/Preference下新建一個以name為名字的plist文件焰宣。[NSUserDefaults standardUserDefaults]是以bundle id為名字的一個plist文件。利用這個我們可以給每一個用戶新建一個偏好設(shè)置的文件捕仔,保存皮膚匕积,字體等,不同的用戶登錄就會有不同的效果榜跌。
NSUserDefaults數(shù)據(jù)清除
- (void)removePersistentDomainForName:(NSString *)domainName;
清除domain下的所有信息闪唆。在這里要說一下NSUserDefaults的域,默認(rèn)包含5個domain钓葫,分別是NSArgumentDomain悄蕾,Application,NSGlobalDomain础浮,Languages帆调,NSRegistrationDomain。
//清除Application所有的偏好設(shè)置豆同,如果domainName是initWithSuiteName的name,則清除name對應(yīng)的plist文件的內(nèi)容
NSString *appDomain =[[NSBundle mainBundle]bundleIdentifier];
[[NSUserDefaults standardUserDefaults]removePersistentDomainForName:appDomain];
NSUserDefaults注意的地方
當(dāng)我們獲取偏好設(shè)置的值的時候贷帮,需要注意,比如如下:[standboolForKey:@"key1"];如果沒有對應(yīng)的key1則獲取的值為默認(rèn)值false诱告。這種情況就有可能和有對應(yīng)的key,并且對應(yīng)的值為false時,區(qū)分不開精居,造成的邏輯錯誤锄禽。類似的還有[standintegerForKey:@""]等。
對應(yīng)的解決辦法是:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"true",@"test",@"3",@"inter", nil]; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//注冊一個默認(rèn)的字典
[stand registerDefaults:dict];
BOOL isok= [stand boolForKey:@"test"];
NSInteger inter= [stand integerForKey:@"inter"];
NSLog(@"%d,,,,%ld",isok,(long)inter);