IOS中NSUserDefaults的用法(輕量級本地數據存儲) (轉)


轉自  http://blog.csdn.net/enuola/article/details/7959767

NSUserDefaults適合存儲輕量級的本地數據,比如要保存一個登陸界面的數據,用戶名、密碼之類的,個人覺得使用NSUserDefaults是首選。下次再登陸的時候就可以直接從NSUserDefaults里面讀取上次登陸的信息咯。

因為如果使用自己建立的plist文件什么的,還得自己顯示創建文件,讀取文件,很麻煩,而是用NSUserDefaults則不用管這些東西,就像讀字符串一樣,直接讀取就可以了。

NSUserDefaults支持的數據格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL類型。很實用吧

NSUserDefaults很方便,讀取也很容易。下面給出一個示例看看如何使用:(PS:更詳細的也可以參考官方文檔哈)

ViewController.h文件中主要是放幾個控件,用於顯示存儲的數據:

 1 #import <UIKit/UIKit.h>
 2 
 3 @interface ViewController : UIViewController
 4 {
 5     
 6     IBOutlet UILabel *txtInteger;
 7     IBOutlet UILabel *txtFloat;
 8     IBOutlet UILabel *txtDouble;
 9     IBOutlet UILabel *txtNSString;
10     IBOutlet UILabel *txtNSDate;
11     IBOutlet UILabel *txtNSArray;
12     IBOutlet UILabel *txtNSDictionary;
13 }
14 
15 @end

ViewController.m文件中最重要的是兩個方法:

saveNSUserDefaults:用於將各種類型數據保存到NSUserDefaults中

readNSUserDefautls:用於從NSUserDefaults中讀取各種類型的數據。在viewDidLoad中調用這兩個方法就可以看出結果咯

  1 #import "ViewController.h"
  2 
  3 @interface ViewController ()
  4 
  5 @end
  6 
  7 @implementation ViewController
  8 
  9 - (void)viewDidLoad
 10 {
 11     [super viewDidLoad];
 12 
 13     [self saveNSUserDefaults];  //調用此方法將各種數據存儲到NSUserDefautls中,在下面定義
 14     [self readNSUserDefaults];  //調用此方法從NSUserDefautls中讀取各種數據,在下面定義
 15 }
 16 
 17 - (void)viewDidUnload
 18 {
 19     [txtNSString release];
 20     txtNSString = nil;
 21     [txtNSDate release];
 22     txtNSDate = nil;
 23     [txtNSArray release];
 24     txtNSArray = nil;
 25     [txtNSDictionary release];
 26     txtNSDictionary = nil;
 27     [txtInteger release];
 28     txtInteger = nil;
 29     [txtFloat release];
 30     txtFloat = nil;
 31     [txtDouble release];
 32     txtDouble = nil;
 33     [super viewDidUnload];
 34     // Release any retained subviews of the main view.
 35 }
 36 
 37 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 38 {
 39     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
 40 }
 41 
 42 - (void)dealloc {
 43     [txtNSString release];
 44     [txtNSDate release];
 45     [txtNSArray release];
 46     [txtNSDictionary release];
 47     [txtInteger release];
 48     [txtFloat release];
 49     [txtDouble release];
 50     [super dealloc];
 51 }
 52 
 53 //保存數據到NSUserDefaults
 54 -(void)saveNSUserDefaults
 55 {
 56     NSString *myString = @"enuola";
 57     int myInteger = 100;
 58     float myFloat = 50.0f;
 59     double myDouble = 20.0;
 60     NSDate *myDate = [NSDate date];
 61     NSArray *myArray = [NSArray arrayWithObjects:@"hello", @"world", nil];
 62     NSDictionary *myDictionary = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"enuo", @"20", nil] forKeys:[NSArray arrayWithObjects:@"name", @"age", nil]];
 63     
 64     //將上述數據全部存儲到NSUserDefaults中
 65     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
 66     //存儲時,除NSNumber類型使用對應的類型意外,其他的都是使用setObject:forKey:
 67     [userDefaults setInteger:myInteger forKey:@"myInteger"];
 68     [userDefaults setFloat:myFloat forKey:@"myFloat"];
 69     [userDefaults setDouble:myDouble forKey:@"myDouble"];
 70     
 71     [userDefaults setObject:myString forKey:@"myString"];
 72     [userDefaults setObject:myDate forKey:@"myDate"];
 73     [userDefaults setObject:myArray forKey:@"myArray"];
 74     [userDefaults setObject:myDictionary forKey:@"myDictionary"];
 75     
 76     //這里建議同步存儲到磁盤中,但是不是必須的
 77     [userDefaults synchronize];
 78     
 79 }
 80 
 81 //從NSUserDefaults中讀取數據
 82 -(void)readNSUserDefaults
 83 {
 84     NSUserDefaults *userDefaultes = [NSUserDefaults standardUserDefaults];
 85     
 86     //讀取數據到各個label中
 87     //讀取整型int類型的數據
 88     NSInteger myInteger = [userDefaultes integerForKey:@"myInteger"];
 89     txtInteger.text = [NSString stringWithFormat:@"%d",myInteger];
 90     
 91     //讀取浮點型float類型的數據
 92     float myFloat = [userDefaultes floatForKey:@"myFloat"];
 93     txtFloat.text = [NSString stringWithFormat:@"%f",myFloat];
 94     
 95     //讀取double類型的數據
 96     double myDouble = [userDefaultes doubleForKey:@"myDouble"];
 97     txtDouble.text = [NSString stringWithFormat:@"%f",myDouble];
 98     
 99     //讀取NSString類型的數據
100     NSString *myString = [userDefaultes stringForKey:@"myString"];
101     txtNSString.text = myString;
102     
103     //讀取NSDate日期類型的數據
104     NSDate *myDate = [userDefaultes valueForKey:@"myDate"];
105     NSDateFormatter *df = [[NSDateFormatter alloc] init];
106     [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
107     txtNSDate.text = [NSString stringWithFormat:@"%@",[df stringFromDate:myDate]];
108     
109     //讀取數組NSArray類型的數據
110     NSArray *myArray = [userDefaultes arrayForKey:@"myArray"];
111     NSString *myArrayString = [[NSString alloc] init];
112     for(NSString *str in myArray)
113     {
114         NSLog(@"str= %@",str);
115         myArrayString = [NSString stringWithFormat:@"%@  %@", myArrayString, str];
116         [myArrayString stringByAppendingString:str];
117 //        [myArrayString stringByAppendingFormat:@"%@",str];
118         NSLog(@"myArrayString=%@",myArrayString);
119     }
120     txtNSArray.text = myArrayString;
121     
122     //讀取字典類型NSDictionary類型的數據
123     NSDictionary *myDictionary = [userDefaultes dictionaryForKey:@"myDictionary"];
124     NSString *myDicString = [NSString stringWithFormat:@"name:%@, age:%d",[myDictionary valueForKey:@"name"], [[myDictionary valueForKey:@"age"] integerValue]];
125     txtNSDictionary.text = myDicString;
126 }
127 
128 @end

好了,運行一下,可以看到xib文件中的各種數據已經綁定上了吧?

 

再次運行的時候,可以把viewDidLoad中的  [self  saveNSUserDefaults];  這一行注釋掉,讓程序直接讀取而不存儲數據,發現以前保存的數據仍然可以讀取到界面上。

嘻嘻,很簡單吧,就這樣就可以是實現數據的存儲了。

下面講一下原理:

你可能會問一個問題:NSUserDefautls將數據存儲在什么地方了???我都沒有顯示的指定路徑???很疑惑吧。。。。

用NSUserDefaults存儲的數據下次程序運行的時候依然存在,它把數據存儲在什么地方了?如何能夠清除?

其實它存儲在應用程序內置的一個plist文件里,這個可以根據路徑看到。
比如說這個是你的程序沙盒位置
/UsersLibrary/Application Support/iPhoneSimulator/4.1/Applicati*****/29788E40-AF47-45A0-8E92-3AC0F501B7F4/,(這個是應用程序對應在mac上的位置)
這個下面有/Library/Prefereces,里面有個plist文件,存儲的就是你的userDefaults
想要刪掉的話,用removeObjectForKey或者刪掉沙盒,也就是你的應用程序然后重新安裝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM