iOS NSUserDefaults

對于應用來說繁疤,每個用戶都有自己的獨特偏好設置瞳氓,而好的應用會讓用戶根據(jù)喜好選擇合適的使用方式挪凑,把這些偏好記錄在應用包的plist文件中阱冶,通過NSUserDefaults類來訪問,這是NSUserDefaults的常用姿勢样勃。如果有一些設置你希望用戶即使升級后還可以繼續(xù)使用流酬,比如玩游戲時得過的最高分回官、喜好和通知設置蓉驹、主題顏色甚至一個用戶頭像城榛,那么你可以使用NSUserDefaults來存儲這些信息,如果有更多需求态兴,可以了解數(shù)據(jù)持久化相關的知識狠持。具體來說NSUserDefaults是iOS系統(tǒng)提供的一個單例類(iOS提供了若干個單例類),通過類方法standardUserDefaults可以獲取NSUserDefaults單例瞻润。如:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSUserDefaults單例以key-value的形式存儲了一系列偏好設置喘垂,key是名稱value是相應的數(shù)據(jù)绍撞。存/取數(shù)據(jù)時可以使用方法objectForKey:setObject:forKey:來把對象存儲到相應的plist文件中正勒,或者讀取,既然是plist文件楚午,那么對象的類型則必須是plist文件可以存儲的類型昭齐。

而如果需要存儲plist文件不支持的類型尿招,比如圖片矾柜,可以先將其歸檔為NSData類型阱驾,再存入plist文件,需要注意的是怪蔑,即使對象是NSArray或NSDictionary里覆,他們存儲的類型也應該是以上范圍包括的。

存/讀不同類型數(shù)據(jù)

比如存/讀一個整數(shù)缆瓣、字符串和一張圖片:

###存

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

[defaults setObject:@”jack“ forKey:@"firstName"];

[defaults setInteger:10 forKey:@"Age"];

UIImage *image =[UIImage imageNamed:@"somename"];

NSData *imageData = UIImageJPEGRepresentation(image, 100);//把image歸檔為NSData

[defaults setObject:imageData forKey:@"image"];

[defaults synchronize];

其中喧枷,方法synchronise是為了強制存儲,其實并非必要弓坞,因為這個方法會在系統(tǒng)中默認調(diào)用隧甚,但是你確認需要馬上就存儲,這樣做是可行的渡冻。

###讀

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSString *firstName = [defaults objectForKey:@"firstName"]

NSInteger age = [defaults integerForKey:@"Age"];

NSData *imageData = [defaults dataForKey:@"image"];

UIImage *image = [UIImage imageWithData:imageData];

我們通過為三個數(shù)據(jù)設置key的方式把NSInteger戚扳、NSString和UIImage三種數(shù)據(jù)存儲下來,其中圖片是通過歸檔為NSData的方式進行存儲的族吻,除此之外帽借,還可以被轉(zhuǎn)為NSNumber或NSString類型。順便提一句超歌,這里NSInteger沒有星號砍艾,因為NSInteger根據(jù)系統(tǒng)是64位還是32位來判斷自身是long還是int類型,并且它也不是一個標準Objective-C對象巍举。

簡便方法存取不同類型數(shù)據(jù)

由上邊的例子可以看到一個方法-setInteger:,這跟常用的-setObject:相比設置類型更明確脆荷。其實,NSUserDefaults提供了若干簡便方法可以存儲某些常用類型的值懊悯,例如:

- setBool:forKey:

- setFloat:forKey:

- setInteger:forKey:

- setDouble:forKey:

- setURL:forKey:

NSUserDefaults域

BOOL showTutorialOnLaunch = [[NSUserDefaults standardUserDefaults] boolForKey:@"ShowTutorial"];

這種情況下简烘,當key值@“ShowTutorial”已設置后會運行正確。但如果默認數(shù)據(jù)庫沒有這個key的默認值時定枷,將會返回NO孤澎,這或許就不一定是你需要的值了,因為無法區(qū)分NO和no value欠窒,前一段所提到的簡便方法大多有這種問題覆旭。

解決方式:使用registerDefaults:方法

首先創(chuàng)建一個包含用戶偏好設置信息的DefaultPreferences.plist文件,添加到target中岖妄。在運行時型将,app就可以加載這個文件并且把內(nèi)容傳到registerDefaults :

NSURL *defaultPrefsFile = [[NSBundle mainBundle]

URLForResource:@"DefaultPreferences" withExtension:@"plist"];

NSDictionary *defaultPrefs = [NSDictionary dictionaryWithContentsOfURL:defaultPrefsFile];

[[NSUserDefaults standardUserDefaults] registerDefaults:defaultPrefs];

注意需要在每次啟動app并且沒有在user defaules中讀取數(shù)據(jù)的時候調(diào)用以上方法,因為registerDefaults:不能把這些默認數(shù)據(jù)存儲到硬盤上荐虐,所以application:didFinishLaunchingWithOptions是最合適的地方七兜。

這樣做的原因是:默認情況下,應用域是空的福扬,沒見鍵也沒有值腕铸。當應用第一次設置某項用戶偏好設置的值時惜犀,相應的值會通過指定的鍵加入應用域。當通過NSUserDefaults獲取某項用戶偏好設置的值時狠裹,NSUserDefaults會先在應用域中查找虽界,如果找到了值,NSUserDefaults就會返回這個值涛菠。如果沒有找到莉御,NSUserDefaults就會在注冊域中查找并返回默認值。

user defaults數(shù)據(jù)庫中其實是由多個層級的域組成的俗冻,當你讀取一個鍵值的數(shù)據(jù)時礁叔,NSUserDefaults從上到下透過域的層級尋找正確的值,不同的域有不同的功能迄薄,有些域是可持久的晴圾,有些域則不行。

應用域(application domain)是最重要的域噪奄,它存儲著你app通過NSUserDefaults set...forKey添加的設置死姚。

注冊域(registration domain)僅有較低的優(yōu)先權,只有在應用域沒有找到值時才從注冊域去尋找勤篮。

全局域(global domain)則存儲著系統(tǒng)的設置

語言域(language-specific domains)則包括地區(qū)都毒、日期等

參數(shù)域( argument domain)有最高優(yōu)先權

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市碰缔,隨后出現(xiàn)的幾起案子账劲,更是在濱河造成了極大的恐慌,老刑警劉巖金抡,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瀑焦,死亡現(xiàn)場離奇詭異,居然都是意外死亡梗肝,警方通過查閱死者的電腦和手機榛瓮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巫击,“玉大人禀晓,你說我怎么就攤上這事“用蹋” “怎么了粹懒?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長顷级。 經(jīng)常有香客問我凫乖,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任帽芽,我火速辦了婚禮删掀,結果婚禮上,老公的妹妹穿的比我還像新娘嚣镜。我一直安慰自己,他們只是感情好橘蜜,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布菊匿。 她就那樣靜靜地躺著,像睡著了一般计福。 火紅的嫁衣襯著肌膚如雪跌捆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天象颖,我揣著相機與錄音佩厚,去河邊找鬼。 笑死说订,一個胖子當著我的面吹牛抄瓦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陶冷,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼钙姊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了埂伦?” 一聲冷哼從身側(cè)響起煞额,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沾谜,沒想到半個月后膊毁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡基跑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年婚温,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媳否。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡缭召,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逆日,到底是詐尸還是另有隱情嵌巷,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布室抽,位于F島的核電站搪哪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坪圾。R本人自食惡果不足惜晓折,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一惑朦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漓概,春花似錦漾月、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至觅彰,卻和暖如春吩蔑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背填抬。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工烛芬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人飒责。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓赘娄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宏蛉。 傳聞我的和親對象是個殘疾皇子擅憔,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 歡迎關注公眾號: CodeReview 關于NSUserDefaults首先要看蘋果官方的定義 NSUserDef...
    sellse閱讀 79,297評論 16 169
  • 兩種方法刪除NSUserDefaults所有記錄 方法一 方法二 賬號和密碼信息 是存儲在Documents 中的...
    TenMios閱讀 814評論 0 2
  • 一、基本概念 1檐晕、之前如果我們想要實現(xiàn)一個對象支持整個應用程序訪問暑诸,需要自己創(chuàng)建一個單例對象,而其實iOS系統(tǒng)內(nèi)部...
    空白Null閱讀 2,687評論 0 3
  • NSUserDefaults支持的數(shù)據(jù)類型有:NSNumber(NSInteger辟灰、float个榕、double),N...
    大輝郞閱讀 646評論 0 1
  • 2016年8月28日00:22:55 我的工作就是教學生芥喇,批作業(yè)西采。 那些電影的就是電影是工作。 我好好享受继控,工作的樂趣械馆。
    lygly9閱讀 173評論 0 0