2013-05-31 97 views
9

我有一個測試人員提交的錯誤,如果他執行一個操作,然後重新啓動他的手機(通過按住家和睡眠/喚醒按鈕幾秒鐘),該應用程序不是持久狀態。NSUserDefaults同步不保存在

我已經能夠重現此問題。 [NSUserDefaults同步] 被調用,但是當我在重新啓動後重新啓動應用程序時,NSUserDefaults內部的值未保存。

有誰知道是否將存儲同步到稍後保存到磁盤的緩衝區?如果是這樣,我怎麼刷新緩衝區(我認爲同步是一樣的沖洗,但顯然不是。)

(編輯) 換句話說:

assert([[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO); 
[[NSUserDefaults standardUserDefaults] setBool: YES forKey: MY_KEY]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

離開應用程序在前臺並在調用上述內容後重新啓動設備,然後啓動設備並重新運行應用程序。斷言應該第二次啓動,但有時不啓動。

要非常具體的......我創建了一個單一視圖的應用程序,並把下面的代碼在viewDidLoad中

#define MY_KEY @"MY_KEY" 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    BOOL key = [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY]; 
    NSLog(@"[[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == %@", key ? @"YES" : @"NO"); 
    [[NSUserDefaults standardUserDefaults] setBool: !key forKey: MY_KEY]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    NSLog(@"reboot now."); 
} 

這裏是應用程序的三次運行的輸出:

2013-05-31 12:17:44.127 syncTest[162:907] [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == YES 
2013-05-31 12:17:44.133 syncTest[162:907] reboot now. 
2013-05-31 12:18:49.771 syncTest[128:907] [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO 
2013-05-31 12:18:49.778 syncTest[128:907] reboot now. 
2013-05-31 12:19:41.388 syncTest[124:907] [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO 
2013-05-31 12:19:41.397 syncTest[124:907] reboot now. 

請注意,輸出是「是,否,否」,但它應該是「是,否,是」

+0

你使用哪個事件調用'[NSUserDefaults synchronize]' –

+0

同步應該可以工作,可能有助於看到一些代碼。你如何設置和獲取數據? – wattson12

+0

聽起來很奇怪,不應該發生。可以請你在你正在同步的地方發佈一些代碼。 – Shantanu

回答

2

我已經經歷了同樣的問題,我確定我有兩個引用[NSUserDefault s standardUserDefaults]對象,因爲nsdefault是一個單例類,所以如果你可能已經引用[NSUserDefaults standardUserDefaults]嘗試從第一個引用完成它,讓實例從那裏釋放,然後調用在你的其他類和同步的實例希望將會完成

+1

您會注意到,在我的示例代碼中,只有一個類具有對NSUserDefaults的引用。所以這不能回答這個問題。如果它適合你,我很高興。 –

+0

在你的示例代碼中它有一個引用,但我告訴你你可能有其他類可能具有相同的引用以及如果你有標準用戶默認對象引用集的參考設置爲零,然後使用..,如果if你沒有在其他地方使用userdefault然後看看你在做什麼 –

+1

謝謝你研究這個問題,但問題甚至出現在只有一個引用的示例代碼中,所以顯然這個問題與無關有多個參考。 –

0

在我的情況下,我寫給NSUserDefaults的一些值確實存在,有些值沒有。經過大量搜索後,我注意到未保存的鍵值對具有capipatilized密鑰,即TheKey v.s theKey。當我將我的密鑰更改爲駱駝式的密鑰(theKey而不是TheKey)時,該值通過應用程序退出並重新啓動而持續存在。對我來說,這似乎很奇怪,但它對我來說很有用。

+1

在上面的示例代碼中,顯示問題的關鍵是完全相同。 –