iOS-淺談NSUserDefaults保存數(shù)據(jù)的缺點(diǎn)以及改進(jìn)方案:UDUserDefaultsModel

在iOS開發(fā)當(dāng)中上渴,我們難免會遇到保存數(shù)據(jù)的情況蝉稳,即數(shù)據(jù)的本地永久存儲挚赊。其中,NSUserDefaults是最常使用的輕量級的數(shù)據(jù)存儲方式。今天小編就來簡單談一下NSUserDefaults跪者。

? ? 相信是個iOS程序猿都使用過NSUserDefaults來保存數(shù)據(jù),因為實(shí)在是太過簡單熄求,只需要使用使用兩行代碼就能保存了渣玲,如下:

圖1:NSUserDefaults的使用

使用NSUserDefaults來存取數(shù)據(jù)代碼非常簡單,但是很多人卻并不知道蘋果內(nèi)部是如何保存這個key-value的弟晚。這里就簡單來說一下:iOS系統(tǒng)是以一個.plist文件來統(tǒng)一管理這些使用NSUserDefaults保存的key-value的忘衍。大家可以參考你所在項目中的info.plist.

當(dāng)然,我們可以驗證一下:在代碼當(dāng)中執(zhí)行NSHomeDirectory()并打印卿城,復(fù)制枚钓,然后在Finder->前往->前往文件夾中粘貼前往,或者在終端中執(zhí)行"cd 剛才復(fù)制的路徑"->"open ."來前往所在沙河路徑瑟押。其中NSUserDefaults就保存在/Library/Preference中搀捷。

下面就看一下我一個demo中的plist文件:

圖2:NSUserDefaults保存數(shù)據(jù)的plist文件

從圖2當(dāng)中的.plist文件可以看到其與工程當(dāng)中的info.plist文件是一樣的,同時還要說一些題外話多望,那就是NSUserDefaults還有一些別的知識點(diǎn)嫩舟,比如圖2中的suitename等,詳情請參考文檔怀偷,這里不詳細(xì)解釋家厌。

說使用NSUserDefaults大家都會用,但是像圖1那樣寫代碼實(shí)在是太惡心了椎工,因為這個樣子寫數(shù)據(jù)根本沒有統(tǒng)一規(guī)劃饭于,而且取值的時候十分不方便

比如做視頻播放器時常用到的下面這個:

圖3:允許流量播放

根據(jù)圖3的顯示可以知道需求:當(dāng)UISwitch關(guān)閉時不允許播放視頻维蒙。這是一個很常見的產(chǎn)品需求掰吕,但是如果按照圖1的方式來寫,那豈不是要在很多地方寫[userDefaults objectForKey:@"key"]木西?所以畴栖,我們應(yīng)摒棄像圖1的那種方式使用NSUserDefaults。

當(dāng)然八千,也有很多人想到了別的方法來解決圖1那樣寫代碼所帶來的困擾吗讶,比如創(chuàng)建一個類文件來聲明所有的key值等!但是那樣子也難免有些麻煩恋捆,代碼寫起來也有些繁瑣照皆。

現(xiàn)在小編就來說說我的解決辦法:NSUserDefaults+單例+runtime。我寫的這個東西已經(jīng)上傳到Github沸停,項目名稱為UDUserDefaultsModel膜毁,并可以支持Cocoapods。

廢話不多說,我這里就來解釋UDUserDefaultsModel的思想以及用法:

1.UDUserDefaultsModel是一個單例瘟滨,可以實(shí)現(xiàn)App內(nèi)部各個類之間的數(shù)據(jù)共享候醒。

2.繼承自UDUserDefaultsModel創(chuàng)建一個子類,比如LCUserDefaultsModel杂瘸,并在.h文件中聲明一些屬性倒淫,這些屬性就是作為plist文件的key值存在的,如下:

圖4:屬性

3.在.m文件當(dāng)中對每一個屬性進(jìn)行@dynamic操作败玉,意為setter與getter方法由類自己實(shí)現(xiàn)敌土,如下:

圖5:@dynamic操作

4.如果想對屬性設(shè)置默認(rèn)值,那么需要重寫setupDefaultValues方法运翼,如下:

圖6:默認(rèn)值操作

其中返干,圖6字典的規(guī)則是@{@"屬性的字符串": @"默認(rèn)值"}

5.以“name”來說,如果想要進(jìn)行取值的話只需要調(diào)用[LCUserDefaultsModel userDefaultsModel].name就行血淌,對"name"進(jìn)行更改并保存到plist文件的話只需要調(diào)用[LCUserDefaultsModel userDefaultsModel].name = @"newName"就可以了矩欠。

其實(shí)說到UDUserDefaultsModel這個小型的替代系統(tǒng)NSUserDefaults的第三方庫實(shí)現(xiàn)原理是:基于Objective-C的Runtime機(jī)制來重寫UDUserDefaultsModel子類的屬性方法,即Setter方法與Getter方法六剥,以達(dá)到一一映射晚顷。UDUserDefaultsModel用到的Runtime的方法有:

1.objc_property_t,property_getName和property_getAttributes這三個方法是用來獲取屬性Property的相關(guān)信息疗疟。

2.class_addMethod是為對象增加方法该默,也就是屬性的Setter與Getter方法。

代碼小編已上傳到Github策彤,項目名稱為UDUserDefaultsModel栓袖,并可以支持Cocoapods,歡迎大家支持店诗。捎帶說一句:別吝嗇你手里的星星裹刮。

(注:小編已根據(jù)同樣的思想來實(shí)現(xiàn)FMDB數(shù)據(jù)庫的存取,文章鏈接:iOS-FMDB改進(jìn)方案YIIFMDB:直接操作Model,純面向?qū)ο笈尤常恍枰獙憇ql語句捧弃。代碼小編也已經(jīng)上傳到Github,項目名稱YIIFMDB,也已經(jīng)支持Cocoapods擦囊,如果您喜歡违霞,請別吝嗇你手里的star。)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞬场,一起剝皮案震驚了整個濱河市买鸽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贯被,老刑警劉巖眼五,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妆艘,死亡現(xiàn)場離奇詭異,居然都是意外死亡看幼,警方通過查閱死者的電腦和手機(jī)批旺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诵姜,“玉大人朱沃,你說我怎么就攤上這事∶┯眨” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵搬卒,是天一觀的道長瑟俭。 經(jīng)常有香客問我,道長契邀,這世上最難降的妖魔是什么摆寄? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮坯门,結(jié)果婚禮上微饥,老公的妹妹穿的比我還像新娘。我一直安慰自己古戴,他們只是感情好欠橘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著现恼,像睡著了一般肃续。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叉袍,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天始锚,我揣著相機(jī)與錄音,去河邊找鬼喳逛。 笑死瞧捌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的润文。 我是一名探鬼主播姐呐,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼转唉!你這毒婦竟也來了皮钠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赠法,失蹤者是張志新(化名)和其女友劉穎麦轰,沒想到半個月后乔夯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡款侵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年末荐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片新锈。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡甲脏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妹笆,到底是詐尸還是另有隱情块请,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布拳缠,位于F島的核電站墩新,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窟坐。R本人自食惡果不足惜海渊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哲鸳。 院中可真熱鬧臣疑,春花似錦、人聲如沸徙菠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婿奔。三九已至芙盘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脸秽,已是汗流浹背儒老。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留记餐,地道東北人驮樊。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像片酝,于是被迫代替她去往敵國和親囚衔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,416評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,111評論 1 32
  • 1雕沿、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,988評論 3 119
  • 當(dāng)聲音的腳步循著文字走過千山萬水 最愜意的练湿,不是駐足美麗的風(fēng)光 而是錦繡江山對朗誦的喚醒和啟迪 愛與大自然的交響 ...
    顏如玉心訴閱讀 988評論 0 0
  • 細(xì)腰苗條的黃蜂和短粗矮胖的土蜂遇見 產(chǎn)生一段不對等 注定分散的情緣 土拔鼠和鵪鶉遇見 情話綿綿 花言巧語的土拔鼠不...
    風(fēng)雨菩提閱讀 145評論 0 2