優秀工程師 NSUserDefault

2021-08-09 09:40:06 字數 3573 閱讀 5134

nsuserdefaults是什麼,有什麼用處

對於應用來說,每個使用者都有自己的獨特偏好設定,而好的應用會讓使用者根據喜好選擇合適的使用方式,把這些偏好記錄在應用包的plist檔案中,通過nsuserdefaults類來訪問,這是nsuserdefaults的常用姿勢。如果有一些設定你希望使用者即使公升級後還可以繼續使用,比如玩遊戲時得過的最高分、喜好和通知設定、主題顏色甚至乙個使用者頭像,那麼你可以使用nsuserdefaults來儲存這些資訊,如果有更多需求,可以了解資料持久化相關的知識。

具體來說nsuserdefaults是ios系統提供的乙個單例類(ios提供了若干個單例類),通過類方法standarduserdefaults可以獲取nsuserdefaults單例。如:

nsuserdefaults *defaults = [nsuserdefaults standarduserdefaults];
nsuserdefaults單例以key-value的形式儲存了一系列偏好設定,key是名稱,value是相應的資料。存/取資料時可以使用方法objectforkey:setobject:forkey:來把物件儲存到相應的plist檔案中,或者讀取,既然是plist檔案,那麼物件的型別則必須是plist檔案可以儲存的型別,正如官方文件中提到的——

而如果需要儲存plist檔案不支援的型別,比如,可以先將其歸檔為nsdata型別,再存入plist檔案,需要注意的是,即使物件是nsarraynsdictionary,他們儲存的型別也應該是以上範圍包括的。

存/讀不同型別資料

比如存/讀乙個整數、字串和一張:

###存

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是為了強制儲存,其實並非必要,因為這個方法會在系統中預設呼叫,但是你確認需要馬上就儲存,這樣做是可行的。

###讀

nsuserdefaults *defaults = [nsuserdefaults standarduserdefaults];

nsstring *firstname = [defaults objectforkey:@"firstname"]

nsinteger age = [defaults integerforkey:@"age"];

nsdata *imagedata = [defaults dataforkey:@"image"];

uiimage *image = [uiimage imagewithdata:imagedata];

我們通過為三個資料設定key的方式把nsintegernsstringuiimage三種資料儲存下來,其中是通過歸檔為nsdata的方式進行儲存的,除此之外,還可以被轉為nsnumbernsstring型別。順便提一句,這裡nsinteger沒有星號,因為nsinteger根據系統是64位還是32位來判斷自身是long還是int型別,並且它也不是乙個標準objective-c物件。

簡便方法訪問不同型別資料

由上邊的例子可以看到乙個方法-setinteger:,這跟常用的-setobject:相比設定型別更明確。其實,nsuserdefaults提供了若干簡便方法可以儲存某些常用型別的值,例如:

- setbool:forkey:

- setfloat:forkey:

- setinteger:forkey:

- setdouble:forkey:

- seturl:forkey:

這將使某些值的設定更簡單。

nsuserdefaults域

考慮這麼一種情況:

bool showtutorialonlaunch = [[nsuserdefaults standarduserdefaults] boolforkey:@"showtutorial"];

nsurl *defaultprefsfile = [[nsbundle mainbundle]

urlforresource:@"defaultpreferences" withextension:@"plist"];

nsdictionary *defaultprefs = [nsdictionary dictionarywithcontentsofurl:defaultprefsfile];

[[nsuserdefaults standarduserdefaults] registerdefaults:defaultprefs];

user defaults資料庫中其實是由多個層級的域組成的,當你讀取乙個鍵值的資料時,nsuserdefaults從上到下透過域的層級尋找正確的值,不同的域有不同的功能,有些域是可持久的,有些域則不行。

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

全域性域(global domain)則儲存著系統的設定

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

引數域( argument domain)有最高優先權

storing data with nsuserdefaults

ios sdk: working with nsuserdefaults

handling default values with nsuserdefaults

優秀工程師 KVC KVO

kvc 與 kvo 是 objective c 的關鍵概念,個人認為必須理解的東西,下面是例項講解。乙個物件擁有某些屬性。比如說,乙個 person 物件有乙個 name 和乙個 address 屬性。以 kvc 說法,person 物件分別有乙個 value 對應他的 name 和 address...

優秀工程師的素質

1.責任感 責任感是一種自覺主動履行分內分外一切有益事情的精神狀態。責任感作為心理學概念,屬於社會道德心理的範疇,是思想道德素質的重要內容。也是工程職業道德的基礎。2.人際交往能力 工程上的成功必定是團隊努力的結果。成功的工程師往往具有良好的人際交往能力。他們不僅需要和受教育程度高的工程師同行以及其...

優秀工程師應該具備哪些素質 優秀工程師的必備素質上

什麼是工程師?工程師是為解決問題而生的。應用工程技術科學和其他有關科學知識,解決工程技術中的各類具體問題。現代科技發展迅猛,使現代工程和工業生產出現了自動化 智慧型化 資訊化 動態化等許多新的特點。為了適應這些情況變化,工程師必須不斷提高自己的主觀在內素養,培養全面的技術能力和社會工作能力,建立合理...