2013-11-14 30 views
1

我曾經遇到過在我的iOS應用中SIGSEGV崩潰:NSUserDefaults的呼叫後立即同步大跌

[[NSUserDefaults standardUserDefaults] synchronize]; 

這是崩潰的堆棧跟蹤的同步命令之後的部分:

CoreFoundation 0x31920232 CFCopyTypeIDDescription + 29 
CoreFoundation 0x3191cd41 <redacted> + 204 
CoreFoundation 0x31910815 <redacted> + 16 
CoreFoundation 0x3188e1ac <redacted> + 140 
CoreFoundation 0x3189d1ff CFDictionaryApplyFunction + 158 
CoreFoundation 0x3191c483 <redacted> + 282 
CoreFoundation 0x318b237f CFPropertyListWriteToStream + 138 
CoreFoundation 0x318b115d <redacted> + 296 
CoreFoundation 0x318b1031 <redacted> + 132 
CoreFoundation 0x318b03c1 <redacted> + 492 
CoreFoundation 0x318b01d1 <redacted> + 20 
CoreFoundation 0x318bb3ff <redacted> + 110 
CoreFoundation 0x318bb8fb <redacted> + 74 
CoreFoundation 0x3193cb3b <redacted> + 30 
CoreFoundation 0x3193d509 <redacted> + 32 
libdispatch.dylib 0x39bd54b7 <redacted> + 22 
libdispatch.dylib 0x39bd99f7 <redacted> + 30 
CoreFoundation 0x318c7045 CFPreferencesAppSynchronize + 312 

這是一個罕見的崩潰,所以我不能重現它,我的問題是:

什麼會導致這樣的崩潰?

+0

U在UserDefaults中保存的是什麼? – AntonijoDev

+0

Numbers(int/float),字符串和日期。沒什麼太花哨的... – am1987

回答

1

我試圖避免這種情況,並且更好地控制默認值,就是通過我的appDelegate(單例類也可以)。我們的想法是,當你要保存的東西,你把它發送到指定的對象,在我的情況:

[appDelegate defaultsSetObject:(id)obj forKey:(NSSString *)key]; 

在該方法中我copy obj的和關鍵(如果他們是可變的對象)。如果我現在遇到麻煩,我可以在每次調用時調用同步(強制立即失敗),或者至少記錄所有內容。

如果您的問題很難重現,花時間重新組織默認代碼可能是值得的。另一方面,您可以創建一個宏,用宏替換所有的默認代碼,並且通過重新定義宏來獲得與我所做的類似的行爲。 [宏會是這樣的:

SAVE_OBJECT_FOR_KEY(obj, key); 

在最簡單的命令的情況下,只保存對象。在調試時,按照上面的建議進行復制,保存並同步。

+0

謝謝,這是一些很好的建議。希望這會對我的情況有所幫助,儘管我無法真正地測試它,因爲我無法自己再現崩潰。 – am1987

0

很可能以前從用戶默認值返回的某些對象已被過度釋放。當包含對象的NSUserDefaults中的字典序列化爲plist時,當它試圖序列化現在已死的對象時發生崩潰