NSUserDefaults
每個應用程序附帶了一組默認的工廠(數據存儲包)。當用戶編輯他或她缺省值,用戶設置的值和工廠默認值存儲在用戶的默認數據庫。因此,每次應用程序啓動時,你需要提醒工廠的缺省值。這個操作稱爲默認註冊。註冊後,您將使用用戶默認值對象來確定用戶想要的應用程序的行爲。這個過程稱爲閱讀和使用默認值。數據從數據庫用戶的默認值將自動讀取的文件系統。您還將創建一個首選項面板,將允許用戶設置默認值。更改默認值對象將自動寫入到文件系統。這個過程被稱爲設置默認值。
下面我們看一張圖片來更簡明瞭解NSUserDefaults的應用原理,工作流程圖如下:
流程圖主要說明在應用程序中用NSUserDefaults設置配置數據,NSUserDefaults把這些數據寫到文件系統上,~/Library/Preferences是存取NSUserDefaults的plist文件的目錄。也可以讀取NSUserDefaults來獲取之前設置的配置數據,進行啓動程序的時候用於加載某些操作。
場景:程序啓動時,保存應用程序上一次關閉之前的操作或者設置的一些選項數據。NSUserDefaults支持的數據類型:NSNumber(包括基本數據類型:NSUInteger,BooL,float,double),NSString,NSURL,NSdate,NSData,NSArray,NSDictionary,但是不支持自定義類型的對象。NSUserDefaults就是一個系統自帶的詞典庫,方便存數據和取數據。
下面看看示例代碼
// NSUserDefaults設置數據保存到磁盤的文件位置
// /Users/mac-d1/Library/Preferences/TestNSUserDefaults.plist
#import <Foundation/Foundation.h>
//爲應用程序註冊工廠默認值
void DoRegisterFactoryDefault()
{
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
//基本數據類型
[defaults setInteger:1 forKey:@"integer"];
[defaults setBool:true forKey:@"bool"];
[defaults setDouble:5.6487 forKey:@"double"];
[defaults setFloat:1.20 forKey:@"float"];
NSURL *url =[NSURL fileURLWithPath:@"/Users/mac-d1/Library/Preferences/TestNSUserDefaults.plist"];
[defaults setURL:url forKey:@"url"];
//數字類型
[defaults setObject:[NSNumber numberWithBool:false] forKey:@"number-bool"];
[defaults setObject:[NSNumber numberWithInteger:2] forKey:@"number-integer"];
[defaults setObject:[NSNumber numberWithInt:3] forKey:@"number-int"];
[defaults setObject:[NSNumber numberWithDouble:6.78485] forKey:@"number-double"];
[defaults setObject:[NSNumber numberWithFloat:2.30] forKey:@"number-float"];
[defaults setObject:@"hello world" forKey:@"string"];
//當前系統的日期
NSDate *date =[NSDate date];
[defaults setObject:date forKey:@"date"];
//詞典
NSDictionary *dic =[NSDictionary dictionaryWithObjectsAndKeys:@"dic1",@"key1",@"dic2",@"key2",@"dic3",@"key3", nil];
[defaults setObject:dic forKey:@"dic"];
//數組
NSArray *array =[NSArray arrayWithObjects:dic,@"array1",@"array2", nil];
[defaults setObject:array forKey:@"array"];
//NSData
NSData *data =[@"NSData data" dataUsingEncoding:NSUTF8StringEncoding];
[defaults setObject:data forKey:@"data"];
//保存設置的數據到磁盤
[defaults synchronize];
}
//讀取數據,改變方法和保存用戶的願望(即用戶想要實現的操作和界面反應的現象)
void ReadFactoryDefaultsToChangeOperater()
{
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
//基本類型
NSUInteger integer =[defaults integerForKey:@"integer"];
BOOL boolValue =[defaults boolForKey:@"bool"];
double doubleValue =[defaults doubleForKey:@"double"];
float floatValue =[defaults floatForKey:@"float"];
NSURL *url =[defaults URLForKey:@"url"];
NSDate *date =[defaults objectForKey:@"date"];
NSLog(@"\ninteger:%ld\n boolValue:%d\n doubleValue:%lf\n floatValue:%f\n url:%@\n date:%@",integer,boolValue,doubleValue,floatValue,[url path],date);
//NSNumber
NSNumber *integetNum=[defaults objectForKey:@"number-integer"];
NSNumber *intNum=[defaults objectForKey:@"number-int"];
NSNumber *boolNum=[defaults objectForKey:@"number-bool"];
NSNumber *doubleNum=[defaults objectForKey:@"number-double"];
NSNumber *floatNum=[defaults objectForKey:@"number-float"];
NSLog(@"\n integetNum:%@\n intNum:%@\n boolNum:%@\n doubleNum:%@\n floatNum:%@\n",integetNum,intNum,boolNum,doubleNum,floatNum);
//object
NSString *str =[defaults objectForKey:@"string"];
NSArray *array =[defaults objectForKey:@"array"];
NSDictionary *dic =[defaults objectForKey:@"dic"];
NSData *data =[defaults objectForKey:@"data"];
NSString *dataStr =[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"\n str:%@\n array:%@\n dic:%@\n dataStr:%@\n",str,array,dic,dataStr);
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
DoRegisterFactoryDefault();
//ReadFactoryDefaultsToChangeOperater();
}
return 0;
}
執行方法ReadFactoryDefaultsToChangeOperater()後的結果:
我們再來看看plist文件的數據: