一 NSUserDefaults簡介
NSUserDefaults類提供了一個與默認系統進行交互的編程接口。NSUserD
efaults對象是用來保存、恢復應用程序相關的偏好設置、配置數據等等。默認系統允許應用程序自定義它的行為去迎合用戶的喜好。你可以在程序運行的時候從用戶默認的數據庫中讀取程序的設置,同時NSUserDefaults的緩存避免了在每次讀取數據時候都打開用戶默認數據庫的操作。可以通過調用synchroni
ze方法來使內存中的緩存與用戶默認系統進行同步。NSUserDefaults類提供了非常方便的方法來讀寫常用的類型,常用的方法有:setBool:forKey、setFloat :forKey、setInteger:forKey、setObject:forKey、setDouble:forKey、setURL:forKey,具體使用哪個方法取決於要存儲的數據類型。其中,方法setObject:
forKey用於存儲NSString、NSDate、NSArry、NSDictionary等復合對象類型。
二 實例代碼
NSUserDefaults是單例,同時也是線程安全的。使用方法如下:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setBool: self.toggleSwitch.on
forKey:kOnOffToggle];
[userDefaults setFloat: self.brightnessSlider.value
forKey:kBrightnessLevel];
注意:上述代碼將數據寫入默認設置數據庫時,並不一定會立即保存這些數據。還需要進一步調用 synchronize 方法確保所有數據都及時寫入:
[userDefaultssynchronize];
要將這些數據讀入 App 中,可根據鍵值和返回類型,調用相應的方法。根據要讀取的數據類型,可選擇 arrayForKey、boolForKey、dateforKey、 dictionaryForKey、 floatForKey、integerForKey、objectForKey、doubleForKey和URLForKey等方法。
NSUserDefaults
*userDefaults = [NSUserDefaults standardUserDefaults];
self.brightnessSlider.value
= [userDefaults floatForKey:kBrightnessLevel];
self.toggleSwitch.on
= [userDefaults boolForKey:kOnOffToggle];
NSUserDefaults適合存儲輕量級的本地數據,比如要保存一個登陸界面的數據,用戶名、密碼之類的,個人覺得使用NSUserDefaults是首選。下次再登陸的時候就可以直接從NSUserDefaults裡面讀取上次登陸的信息。
因為如果使用自己建立的plist文件什麼的,還得自己顯示創建文件,讀取文件,很麻煩,而是用NSUserDefaults則不用管這些東西,就像讀字符串一樣,直接讀取就可以了(NSUserDefaults中的數據最終都會存儲到plist屬性列表裡面)。NSUserDefaults支持的數據格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL類型。
NSUserDefaults很方便,讀取也很容易。下面給出一個示例看看如何使用,ViewController.h文件中主要是放幾個控件,用於顯示存儲的數據:
[cpp] view
plaincopy
-
#import
-
-
@interface ViewController : UIViewController
-
{
-
-
IBOutlet UILabel *txtInteger;
-
IBOutlet UILabel *txtFloat;
-
IBOutlet UILabel *txtDouble;
-
IBOutlet UILabel *txtNSString;
-
IBOutlet UILabel *txtNSDate;
-
IBOutlet UILabel *txtNSArray;
-
IBOutlet UILabel *txtNSDictionary;
-
}
-
-
@end
ViewController.m文件中最重要的是兩個方法:
saveNSUserDefaults:用於將各種類型數據保存到NSUserDefaults中
readNSUserDefautls:用於從NSUserDefaults中讀取各種類型的數據。在viewDidLoad中調用這兩個方法就可以看出結果咯
[cpp] view
plaincopy
-
#import "ViewController.h"
-
-
@interface ViewController ()
-
-
@end
-
-
@implementation ViewController
-
-
- (void)viewDidLoad
-
{
-
[super viewDidLoad];
-
-
[self saveNSUserDefaults]; //調用此方法將各種數據存儲到NSUserDefautls中,在下面定義
-
[self readNSUserDefaults]; //調用此方法從NSUserDefautls中讀取各種數據,在下面定義
-
}
-
-
- (void)viewDidUnload
-
{
-
[txtNSString release];
-
txtNSString = nil;
-
[txtNSDate release];
-
txtNSDate = nil;
-
[txtNSArray release];
-
txtNSArray = nil;
-
[txtNSDictionary release];
-
txtNSDictionary = nil;
-
[txtInteger release];
-
txtInteger = nil;
-
[txtFloat release];
-
txtFloat = nil;
-
[txtDouble release];
-
txtDouble = nil;
-
[super viewDidUnload];
-
// Release any retained subviews of the main view.
-
}
-
//保存數據到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]];
-
-
//將上述數據全部存儲到NSUserDefaults中
-
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
-
//存儲時,除NSNumber類型使用對應的類型意外,其他的都是使用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中讀取數據
-
-(void)readNSUserDefaults
-
{
-
NSUserDefaults *userDefaultes = [NSUserDefaults standardUserDefaults];
-
-
//讀取數據到各個label中
-
//讀取整型int類型的數據
-
NSInteger myInteger = [userDefaultes integerForKey:@"myInteger"];
-
txtInteger.text = [NSString stringWithFormat:@"%d",myInteger];
-
-
//讀取浮點型float類型的數據
-
float myFloat = [userDefaultes floatForKey:@"myFloat"];
-
txtFloat.text = [NSString stringWithFormat:@"%f",myFloat];
-
-
//讀取double類型的數據
-
double myDouble = [userDefaultes doubleForKey:@"myDouble"];
-
txtDouble.text = [NSString stringWithFormat:@"%f",myDouble];
-
-
//讀取NSString類型的數據
-
NSString *myString = [userDefaultes stringForKey:@"myString"];
-
txtNSString.text = myString;
-
-
//讀取NSDate日期類型的數據
-
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]];
-
-
//讀取數組NSArray類型的數據
-
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);
-
}
-
txtNSArray.text = myArrayString;
-
-
//讀取字典類型NSDictionary類型的數據
-
NSDictionary *myDictionary = [userDefaultes dictionaryForKey:@"myDictionary"];
-
NSString *myDicString = [NSString stringWithFormat:@"name:%@, age:%d",
[myDictionary valueForKey:@"name"], [[myDictionary valueForKey:@"age"] integerValue]];
-
txtNSDictionary.text = myDicString;
-
}
-
-
@end
好了,運行一下,可以看到xib文件中的各種數據已經綁定上了吧?
vcHLo7/I57rOxNy5u8fls/2jv8bkyrXL/LTmtKLU2tOm08OzzNDyxNrWw7XE0ru49nBsaXN0zsS8/sDvo6zV4rj2v8nS1Lj5vt3Ct762v7S1vaGjscjI58u11eK49srHxOO1xLPM0PLJs7rQzrvWwzogL1VzZXJzL0xpYnJhcnkvQXBwbGljYXRpb24KIFN1cHBvcnQvaVBob25lU2ltdWxhdG9yLzQuMS9BcHBsaWNhdGkqKioqKi8yOTc4OEU0MC1BRjQ3LTQ1QTAtOEU5Mi0zQUMwRjUwMUI3RjQvLKOo1eK49srH06bTw7PM0PK21NOm1NptYWPJz7XEzrvWw6Op1eK49s/Cw+bT0C9MaWJyYXJ5L1ByZWZlcmVjZXOjrMDvw+bT0Lj2cGxpc3TOxLz+o6y05rSitcS+zcrHxOO1xHVzZXJEZWZhdWx0c8/r0qrJvrX0tcS7sKOs08NyZW1vdmVPYmplY3RGb3JLZXm78tXfyb619MmzutCjrNKyvs3Kx8TjtcTTptPDs8zQ8si7uvPW2NDCsLLXsKGjPC9wPgoKPHN0cm9uZz7I/SDXotLizsrM4jwvc3Ryb25nPgoKICAgIDGholVzZXJEZWZhdWx0c8rHuPm+3cqxvOS0wbaoyrG1xLDRu7q05tbQtcTK/b7d0LTI67G+tdi0xcXMo6y2+LfHvLTKsdC0yOuho86qwcu3wNa5yv2+3baqyqejrM7Sw8fU2rbU1tjSqrXEyv2+3bGjtObKscq508NzeW5jaG9ybml6Zbe9t6jHv9bG0LTI66GjtavKx9Ky0qrXotLio6yyu9PDxrW3sbXEyrnTw3N5bmNob3JuaXplo6zV4tH5sc++udOwz+zQ1MTcus3Qp8LKo6wKCiAgICAyoaJJT1OxvrXYtOa0os671sPLtcP3CjxwPgo8L3A+Cjx0YWJsZSBib3JkZXI9"0" cellpadding="5" cellspacing="0">
/Documents/
您應該將所有的應用程序數據文件寫入到這個目錄下。這個目錄用於存儲用戶數據或其它應該定期備份的信息。有關如何取得這個目錄路徑的信息,請參見“獲取應用程序目錄的路徑”部分。
iTunes會備份這個目錄的內容。
/Library/Preferences
這個目錄包含應用程序的偏好設置文件。您不應該直接創建偏好設置文件,而是應該使用NSUserDefaults
類或CFPreferences API來取得和設置應用程序的偏好,詳情請參見“添加Settings程序包”部分。
iTunes會備份這個目錄的內容。