NSUserDefault 的使用
1、NSUserDefault的使用:
作用:NSUserDefaults類提供了一個與默認系統(tǒng)進行交互的編程接口。NSUserDefaults對象是用來保存,恢復(fù)應(yīng)用程序相關(guān)的偏好設(shè)置,配置數(shù)據(jù)等等。默認系統(tǒng)允許應(yīng)用程序自定義它的行為去迎合用戶的喜好。你可以在程序運行的時候從用戶默認的數(shù)據(jù)庫中讀取程序的設(shè)置。同時NSUserDefaults的緩存避免了在每次讀取數(shù)據(jù)時候都打開用戶默認數(shù)據(jù)庫的操作。可以通過調(diào)用synchronize方法來使內(nèi)存中的緩存與用戶默認系統(tǒng)進行同步。
原理:NsUserDefault是用戶輕量級的數(shù)據(jù)持久化,主要用于保存用戶程序的配置等信息,以便下次啟動程序后能恢復(fù)上次的設(shè)置。因為是寫到了硬盤上,所以會出現(xiàn)用多了會造成系統(tǒng)浪費,內(nèi)存占用過大等問題。
(1)、該數(shù)據(jù)實際上是以“鍵值對”形式保存的(類似于NSDictionary),因此我們需要通過key來讀取或者保存數(shù)據(jù)(value)。
(2)、NSUserDefaults類提供了非常方便的方法來獲取常用的類型,例如floats,doubles,intergers,Booleans,URLs。所以這也就是說我們可以存儲NSData,NSString,NSNUmber,NSDate,NSArray,NSDictionary(目前有五種類型)這些實例。如果你想存儲其他類型的對象,你要將其歸檔并創(chuàng)建一個NSData來實現(xiàn)存儲。
? ? ? (3)、從NSUserDefaults返回的值是不可改變的,即便是你在存儲的時候使用的是可變的值。例如你使用mutable string做為“MyStringDefault”的值,當你做使用stringForKey:方法獲取的值,這個值仍然是不可變的。
? ? (4)、NSUserDefaults是單例,同時也是線程安全的
語法:
存儲整型的例子:
1、獲取一個NSUserDefaults引用:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
2、保存數(shù)據(jù)
[userDefaults setInteger:1 forKey:@"segment"];
?
[userDefaults synchronize];
3、讀取數(shù)據(jù)
int i = [userDefaults integerForKey:@"segment"];
存儲其他數(shù)據(jù)類型的例子:
保存數(shù)據(jù):保存UIcolor類型的,超出上面的5種數(shù)據(jù)類型,就要進行歸檔,把它們歸檔成data類型的數(shù)據(jù)之后再保存。
?
NSData *objColor = [NSKeyedArchiver archivedDataWithRootObject:[UIColor redColor]];
[[NSUserDefaults standardUserDefaults]setObject:objColor forKey:@"myColor"];
?
讀取數(shù)據(jù):
?
NSData *objColor = [[NSUserDefaults standardUserDefaults]objectForKey:@"myColor"];
?
UIColor *myColor = [NSKeyedUnarchiver unarchiveObjectWithData:objColor];
2、NSUserDefault的使用小技巧:
(1)、NSUserDefault保存的數(shù)據(jù)在程序沒有關(guān)閉前能成功讀取到,但是當應(yīng)用程序重啟之后,就無法讀取到,原因就是數(shù)據(jù)沒有即時寫入。通過官方文檔可以了解到,UserDefaults是根據(jù)時間戳定時的把緩存中的數(shù)據(jù)寫入本地磁盤,而非即時寫入。所以調(diào)用set方法之后數(shù)據(jù)有可能還沒有寫入磁盤,應(yīng)用程序就已經(jīng)終止了。保險起見,我們在對重要的數(shù)據(jù)保存時使用synchornize方法強制寫入。但是也要注意,不用頻繁的使用synchornize。
?
(2)、在使用NSUserDefault的時候,很多人以為:
[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"testInfo"] ;
后就已經(jīng)算存儲好了,再通過
[[NSUserDefaults standardUserDefaults] objectForKey:@"testInfo"];
就可以取出剛剛存的數(shù)據(jù)。
?
其實正常情況下沒有問題,但是當重起
程序,關(guān)鍵字testInfo對應(yīng)的竟然是空,這是什么情況呢??
?
我看看NSUserDefaults的頭文件,就會發(fā)現(xiàn),其實還有另外一個方法:synchronize,數(shù)據(jù)即時寫入。
?
如果我們在set后,執(zhí)行下面的語句:
[[NSUserDefaults standardUserDefaults] synchronize];?
那么就不會出現(xiàn)上面的取出數(shù)據(jù)為空的情況了。
?
完整代碼如下:
//存入數(shù)據(jù)
NSUserDefaults?*defaults?=[NSUserDefaults?standardUserDefaults];
[defaults?setObject:@"111"?forKey:@"t
est"];
//把數(shù)據(jù)寫到硬盤上
[defaults?synchronize];
?
//取出數(shù)據(jù)
NSString?*testStr?=[defaults?objectForKey:@"test"];
NSLog(@"testStr is: %@",testStr);
3、NSUserDefault的一些實際使用:
在使用NSUserDefaults的時候,
先看下下面的代碼
NSDictionary* defaults = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
NSLog(@"Defaults: %@", defaults);
是用來獲取設(shè)備上的所有的NSUserDefaults的設(shè)置。
上面代碼輸出了
Defaults: {
? ? AppleITunesStoreItemKinds = ? ? (
? ? ? ? eBook,
? ? ? ? document,
? ? ? ? "software-update",
? ? ? ? booklet,
? ? ? ? "itunes-u",
? ? ? ? newsstand,
? ? ? ? artist,
? ? ? ? podcast,
? ? ? ? "podcast-episode",
? ? ? ? software
? ? );
? ? AppleKeyboards = ? ? (
? ? ? ? "zh_Hans-Pinyin@sw=Pinyin;hw=US",
? ? ? ? "en_US@hw=US;sw=QWERTY"
? ? );
? ? AppleKeyboardsExpanded = 1;
? ? AppleLanguages = ? ? (
? ? ? ? "zh-Hans",en,?fr,?de,?ja,? ?nl,? it,?es,? pt,?"pt-PT",?da,? fi,? nb,?sv,ko,
? ? ? ? "zh-Hant",?ru,?pl,?tr,uk,?ar,?hr,?cs,?el,?he,ro,? sk,th,?id,
? ? ? ? "en-GB",?ca,?hu,?vi
? ? );
如果想單獨看某個key的設(shè)置,例如:
NSArray *array = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleKeyboards"];
NSLog(@"Keyboards: %@", array);
會輸出
? ? AppleKeyboards = ? ? (
? ? ? ? "zh_Hans-Pinyin@sw=Pinyin;hw=US",
? ? ? ? "en_US@hw=US;sw=QWERTY"
? ? );
在看下面的代碼
if([[NSUserDefaults standardUserDefaults] objectForKey:@"message"]==nil){
??????????[[NSUserDefaults standardUserDefaults] setObject:@"This_is_my_default_message" forKey:@"message"];
}
代碼意思是判斷NSUserDefaults的“message”key 在dictionaryRepresentation中是否存在,如果不存在就
設(shè)置“message”key為This_is_my_default_message。
在加上句[[NSUserDefaults standardUserDefaults] synchronize];,這樣這個設(shè)置就存到默認參數(shù)中了。
?
也見過別人把默認參數(shù)的設(shè)置寫到applicationDidFinishLaunching注冊的,
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
???? NSDictionary *defaultValues = [NSDictionary dictionaryWithObjectsAndKeys:
?????????????????????????????????? @"This_is_my_default_message", @"message",?
?????????????????????????????????? nil];
????[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
????[[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:defaultValues];
}
當然寫到applicationDidFinishLaunching中注冊和不寫到里面效果是一樣的,只是代碼的優(yōu)美問題。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的NSUserDefault 的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server 2012 Alwa
- 下一篇: 函数习题