nsuserdefaults是用于儲存應用程式設定,應用資訊等輕量級資料的的一個類,其本質是将資料寫為plist檔案的形式儲存在本地。在ios中,系統為每一個應用程式都預設建立了一個nsuserdefaults對象。
+ (nsuserdefaults *)standarduserdefaults;
擷取系統預設建立的應用程式設定表
+ (void)resetstandarduserdefaults;
這個方法用于将記憶體中存儲的資料寫入磁盤,當nsuserdefaults的資料表改變的時候,系統不會立刻将其同步到磁盤,而是隔一段時間進行同步,我們可以手動調用這個方法進行同步。
- (instancetype)initwithsuitename:(nsstring *)suitename;
這個方法建立一個新的域:根據名字可以建立一些不同的域,分别存儲幾套設定資訊。
- (id)objectforkey:(nsstring *)defaultname;
- (void)setobject:(id)value forkey:(nsstring *)defaultname;
- (void)removeobjectforkey:(nsstring *)defaultname;
上面三個方法是對對象存儲進行的操作,分别是存儲,擷取和删除。
- (nsstring *)stringforkey:(nsstring *)defaultname;
擷取字元串資料
- (nsarray *)arrayforkey:(nsstring *)defaultname;
擷取數組資料
- (nsdictionary *)dictionaryforkey:(nsstring *)defaultname;
擷取字典資料
- (nsdata *)dataforkey:(nsstring *)defaultname;
擷取data資料
- (nsarray *)stringarrayforkey:(nsstring *)defaultname;
擷取字元串數組資料
- (nsinteger)integerforkey:(nsstring *)defaultname;
擷取整型資料
- (float)floatforkey:(nsstring *)defaultname;
擷取浮點型資料
- (double)doubleforkey:(nsstring *)defaultname;
擷取雙精度浮點型資料
- (bool)boolforkey:(nsstring *)defaultname;
擷取布爾詩句
- (nsurl *)urlforkey:(nsstring *)defaultname;
擷取網址資料
下面是一些對應的set方法
- (void)setinteger:(nsinteger)value forkey:(nsstring *)defaultname;
- (void)setfloat:(float)value forkey:(nsstring *)defaultname;
- (void)setdouble:(double)value forkey:(nsstring *)defaultname;
- (void)setbool:(bool)value forkey:(nsstring *)defaultname;
- (void)seturl:(nsurl *)url forkey:(nsstring *)defaultname;
- (void)registerdefaults:(nsdictionary *)registrationdictionary;
這個方法可以通過字典對資料表進行指派
- (void)addsuitenamed:(nsstring *)suitename;
添加一個域
- (void)removesuitenamed:(nsstring *)suitename;
移除一個域
- (nsdictionary *)dictionaryrepresentation;
傳回系統設定的資訊,也是nsglobaldomain域中的資訊。
@property (readonly, copy) nsarray *volatiledomainnames;
傳回一個數組,其中是所有不穩定域的名字
- (nsdictionary *)volatiledomainforname:(nsstring *)domainname;
根據名字擷取不穩定域中的資料
- (void)setvolatiledomain:(nsdictionary *)domain forname:(nsstring *)domainname;
根據名字設定不穩定域
- (void)removevolatiledomainforname:(nsstring *)domainname;
根據名字移除不穩定域
- (nsdictionary *)persistentdomainforname:(nsstring *)domainname;
根據名字擷取穩定域的資料
- (void)setpersistentdomain:(nsdictionary *)domain forname:(nsstring *)domainname;
根據名字設定穩定域
- (void)removepersistentdomainforname:(nsstring *)domainname;
根據名字移除穩定域
- (bool)synchronize;
對象的同步方法,将記憶體中的資料寫入磁盤。
- (bool)objectisforcedforkey:(nsstring *)key;
判斷某個鍵值的資料是否存在
- (bool)objectisforcedforkey:(nsstring *)key indomain:(nsstring *)domain;
判斷某個域中某個鍵值的資料是否存在
我們應該了解到,在ios中,因為沙盒模式的存在,應用間是不允許互相通路資料與傳值通信的。這樣做的好處顯而易見:
1、保證了資料的安全性
2、資料的管理更加簡潔
3、當我們删除資料時,隻需要将沙盒删除。
在某些需求下,我們可能會需要應用程式間的傳值與通信,當然除了通過網絡外,對于非常小的資料量,比如驗證另一應用從程式是否登入,是否安裝并且開啟過一次,我們也可以通過nsuserdefaults的一個全局的資料表來實作。
nsuserdefaults的三個特殊的系統域如下:
nsstring * const nsglobaldomain;
這個是一個系統級别的全局的域,存儲這系統配置資訊,我們可以通過它實作應用程式間傳值
nsstring * const nsargumentdomain;
這個是在本應用程式内可通路的域,存儲着應用程式的資訊
nsstring * const nsregistrationdomain;
這個是存放臨時資料的域
代碼示例如下:
首先在第一個工程中,我們寫如下代碼運運作一下:
<a href="http://my.oschina.net/u/2340880/blog/411344#">?</a>
1
2
3
4
5
6
7
8
9
<code> </code><code>//擷取全局的域</code>
<code> </code><code>nsdictionary * dic = [[nsuserdefaults standarduserdefaults]persistentdomainforname:nsglobaldomain];</code>
<code> </code><code>nsmutabledictionary * temdic = [nsmutabledictionary dictionarywithdictionary:dic];</code>
<code> </code><code>[temdic setobject:@</code><code>"傳遞的值"</code> <code>forkey:@</code><code>"應用1"</code><code>];</code>
<code> </code><code>//重設</code>
<code> </code><code>[[nsuserdefaults standarduserdefaults]setpersistentdomain:temdic forname:nsglobaldomain];</code>
<code> </code><code>//同步</code>
<code> </code><code>[nsuserdefaults resetstandarduserdefaults];</code>
<code> </code><code>nslog(@</code><code>"%@"</code><code>,dic);</code>
列印的結果是許多系統資訊。
在第二個工程中,我們這樣做:
<code> </code><code>nsdictionary * dic = [[nsuserdefaults standarduserdefaults]persistentdomainforname:nsglobaldomain];</code>
<code> </code><code>nslog(@</code><code>"%@\n--------------\n%@=%@"</code><code>,dic,@</code><code>"應用1"</code><code>,[dic objectforkey:@</code><code>"應用1"</code><code>]);</code>
結果如下:
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<code>2015-05-06 15:48:49.897 321[4100:186745] {</code>
<code> </code><code>appleitunesstoreitemkinds = (</code>
<code> </code><code>newsstand,</code>
<code> </code><code>podcast,</code>
<code> </code><code>"itunes-u"</code><code>,</code>
<code> </code><code>artist,</code>
<code> </code><code>booklet,</code>
<code> </code><code>document,</code>
<code> </code><code>ebook,</code>
<code> </code><code>software,</code>
<code> </code><code>"software-update"</code><code>,</code>
<code> </code><code>"podcast-episode"</code>
<code> </code><code>);</code>
<code> </code><code>applelanguages = (</code>
<code> </code><code>en,</code>
<code> </code><code>fr,</code>
<code> </code><code>de,</code>
<code> </code><code>"zh-hans"</code><code>,</code>
<code> </code><code>"zh-hant"</code><code>,</code>
<code> </code><code>ja,</code>
<code> </code><code>nl,</code>
<code> </code><code>it,</code>
<code> </code><code>es,</code>
<code> </code><code>"es-mx"</code><code>,</code>
<code> </code><code>ko,</code>
<code> </code><code>pt,</code>
<code> </code><code>"pt-pt"</code><code>,</code>
<code> </code><code>da,</code>
<code> </code><code>fi,</code>
<code> </code><code>nb,</code>
<code> </code><code>sv,</code>
<code> </code><code>ru,</code>
<code> </code><code>pl,</code>
<code> </code><code>tr,</code>
<code> </code><code>uk,</code>
<code> </code><code>ar,</code>
<code> </code><code>hr,</code>
<code> </code><code>cs,</code>
<code> </code><code>el,</code>
<code> </code><code>he,</code>
<code> </code><code>ro,</code>
<code> </code><code>sk,</code>
<code> </code><code>th,</code>
<code> </code><code>id,</code>
<code> </code><code>ms,</code>
<code> </code><code>"en-gb"</code><code>,</code>
<code> </code><code>"en-au"</code><code>,</code>
<code> </code><code>ca,</code>
<code> </code><code>hu,</code>
<code> </code><code>vi,</code>
<code> </code><code>hi</code>
<code> </code><code>applelocale = </code><code>"en_us"</code><code>;</code>
<code> </code><code>msvloggingmasterswitchenabledkey = 0;</code>
<code> </code><code>"\u5e94\u75281"</code> <code>= </code><code>"\u4f20\u9012\u7684\u503c"</code><code>;</code>
<code>}</code>
<code>--------------</code>
<code>應用1=傳遞的值</code>
這樣,我們就簡單實作了應用程式間的傳值,但是建議最好不要輕易作業系統的這個域。