NSUserDefaults是單例類。在整個程序中只有一個實例對象落塑,可以用于數(shù)據(jù)的永久保存窗声,顧大家喜歡用它保存簡單數(shù)據(jù)巧颈。它支持的數(shù)據(jù)類型有:NSNumber(NSInteger、float兜粘、double)申窘,NSString,NSDate孔轴,NSArray剃法,NSDictionary,BOOL路鹰。如果想要將這些數(shù)據(jù)類型的數(shù)據(jù)永久保存到NSUserDefaults中去贷洲,只需要簡單的操作(一個Value 一個Key )。
? ? ? ?NSString *passWord = @"123";
? ? ? ?NSUserDefaults *user = [NSUserDefaults standarUserDefaults];
? ? ? ?[user setObject:passWord forKey:@"userPassWord"];
單例類:是單例模式的一個實例晋柱,而模式單例是一種常見的編程方式优构。在iOS中,單例模式很常見雁竞,它用于確保特定類只有一個實例钦椭。單例最常用于表示硬件或者操作系統(tǒng)向應用程序提供的服務。
NSUerDefaults類提供了一個默認的 系統(tǒng)編程接口進行交互,可以說是最簡單的存儲方式之一玉凯,一般用來存儲應用程序相關(guān)的偏好設(shè)置势腮,配置數(shù)據(jù)等,以便于下次啟動程序之后能恢復上次的設(shè)置漫仆。而且它可以在程序的任何地方存儲和讀取數(shù)據(jù)捎拯。在運行時,可以使用NSUerDefaults對象讀取應用程序的默認數(shù)據(jù)庫來獲取數(shù)據(jù)盲厌。NSUerDefaults具有緩存機制署照,所以不必再每次讀取數(shù)據(jù)的時候都打開應用程序的默認設(shè)置數(shù)據(jù)庫÷鸷疲可以通過synchronize方法來使內(nèi)存中的緩存與系統(tǒng)默認數(shù)據(jù)庫進行同步建芙。
值得注意的是:
NSUserDefaults 存儲的對象全是不可變的(這一點非常關(guān)鍵,弄錯的話程序會出bug)懂扼,例如禁荸,如果我想要存儲一個 NSMutableArray 對象,我必須先創(chuàng)建一個不可變數(shù)組(NSArray)再將它存入NSUserDefaults中去.
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];
NSArray * array = [NSArray arrayWithArray:mutableArray];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:array forKey:@"記住存放的一定是不可變的"];
取出數(shù)據(jù)是一樣的阀湿,想要用NSUserDefaults中的數(shù)據(jù)給可變數(shù)組賦值
先給出一個錯誤的寫法:
/*-------------------------錯誤的賦值方法-------------------*/
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//這樣寫后赶熟,mutableArray 就變成了不可變數(shù)組了,如果你要在數(shù)組中添加或刪除數(shù)據(jù)就會出現(xiàn)bug
NSMutableArray *mutableArray = [user objectForKey:@"記住存放的一定是不可變的"];
正確的寫法:
/*-------------------------正確的賦值方法-------------------*/
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//可以用alloc 方法代替
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"記住存放的一定是不可變的"]];
二陷嘴、使用 NSUserDefaults 存儲自定義對象
1映砖、將自定義類型轉(zhuǎn)換為NSData類型
當數(shù)據(jù)重復而且多的時候(例如想存儲全班同學的學號,姓名灾挨,性別(這個數(shù)據(jù)量可能太大了 ))邑退,如果不用SQLite 存儲 (多數(shù)據(jù)最好還是用這個),你可以選擇使用歸檔劳澄,再將文件寫入本地地技,但是這種方式和 NSUserDefaults 比起來麻煩多了(因為NSFileManage 本來就挺復雜) ,但是問題是秒拔,NSUserDefaults 本身不支持自定義對象的存儲乓土,不過它支持NSData的類型。我們要做的就是將自定義類型變成NSData類型 溯警,這里要實現(xiàn) 在.h 文件中申明 NSCoding 協(xié)議趣苏,再 在 .m 中實現(xiàn) encodeWithCoder 方法 和initWithCoder 方法就可以將自定義類型轉(zhuǎn)化為類型了。
2梯轻、將自定義類型數(shù)據(jù)存入 NSUserDefaults 中
如果要存儲全班同學的信息食磕,我們可以建一個NSMutableArray 來存放全班同學的信息(里面存儲的全是NSData對象)在需要存儲的地方加入代碼:
//首先,要建立一個可變數(shù)組來存儲 NSDate對象
Student *student = [[Student alloc] init];
//下面進行的是對student對象的 name 喳挑, studentNumber 彬伦,sex 的賦值
student.name = @"WJX";
student.studentNumber = @"123";
student.sex = @"男";
//這是一個存放全班同學的數(shù)組
NSMutableArray * dataArray = [NSMutableArray arrayWithCapacity:0];
//將student類型變?yōu)镹SData類型
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];
//存放數(shù)據(jù)的數(shù)組將data加入進去
[dataArray addObject:data];
如果你只想存一個人的信息滔悉,你可以直接將NSData存入NSUserDefaults中 :
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:data forKey:@"oneStudent"];
如果你想存儲全班同學的信息,你還要用一個for循環(huán)將data 放入 dataArray中单绑,這里具體的操作就不實現(xiàn)了回官,只給出存放的代碼:
//記住要轉(zhuǎn)換成不可變數(shù)組類型
NSArray * array = [NSArray arrayWithArray:dataArray];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:array forKey:@"allStudent"];
從NSUserDefaults中取出數(shù)據(jù)在還原也很簡單
例如還原一個學生的數(shù)據(jù):
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSdData *data = [user objectForKey:@"oneStudent"];
Student *student = [NSKeyedUnarchiver unarchiveObjectWithData:data];
總之,NSUserDefaults 在我們編寫代碼中是最常用的一個永久保存數(shù)據(jù)的方法搂橙,也是最簡單的歉提。
補充:NSUserDefaults是定時把緩存中的數(shù)據(jù)寫入磁盤的,而不是即時寫入区转,為了防止在寫完NSUserDefaults后程序退出導致的數(shù)據(jù)丟失苔巨,可以在寫入數(shù)據(jù)后使用synchronize強制立即將數(shù)據(jù)寫入磁盤
[user synchronize]; 運行上面的語句后(這里的user指的是NSUserDefaults的指針),NSUserDefaults中的數(shù)據(jù)即被寫入到.plist文件中废离,如果是在模擬器上運行程序侄泽,可以在Mac的/Users/YOUR-USERNAME/Library/Application Support/iPhone Simulator/4.1/Applications/YOUR-APP-DIR/Library/Prefereces目錄下面找到一個文件名為YOUR-Bundle_Identifier.plist的plist文件,用Xcode打開該文件蜻韭,可以看到剛才寫入的數(shù)據(jù)悼尾。