在我開始之前,我應該告訴你,這個只有發生在iOS 5.1中。在最近的更新之前,這從來沒有發生過,並且在任何其他版本上都不會發生。這就是說,這是發生了什麼事。爲什麼在創建UIWebView時清除NSUserDefaults會導致EXC_CRASH?
當用戶退出我的應用程序時,發生的一件事是所有NSUserDefaults
都被刪除。而不是手動刪除每一個關鍵我可能會添加到用戶的默認,我只是完全刪除所有NSUserDefaults
的,使用this SO question建議的方法:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
有什麼事雖然發生的,是每次我嘗試刪除NSUserDefaults
後創建一個UIWebView
,我得到一個EXC_CRASH (SIGABRT)
。當我打電話給[[UIWebView alloc] initWithFrame:frame]
時發生了這次事故。奇怪的權利?完全退出並重新打開應用程序允許再次創建UIWebView
。
因此,我設法弄清楚刪除默認值會導致UIWebView
問題,但可以肯定的是,我爲-[NSUserDefaults setObject:forKey:]
添加了一個符號斷點。
創建UIWebView
確實觸發斷點。
戳通過崩潰日誌讓我異常的原因:
-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: WebKitLocalStorageDatabasePathPreferenceKey)
而這裏的堆棧跟蹤的開頭:
0 CoreFoundation 0x3340688f __exceptionPreprocess + 163
1 libobjc.A.dylib 0x37bd4259 objc_exception_throw + 33
2 CoreFoundation 0x33406789 +[NSException raise:format:] + 1
3 CoreFoundation 0x334067ab +[NSException raise:format:] + 35
4 CoreFoundation 0x3337368b -[__NSCFDictionary setObject:forKey:] + 235
5 WebKit 0x3541e043 -[WebPreferences _setStringValue:forKey:] + 151
6 UIKit 0x32841f8f -[UIWebView _webViewCommonInit:] + 1547
7 UIKit 0x328418d7 -[UIWebView initWithFrame:] + 75
8 MyApp 0x0007576f + 0
9 UIKit 0x326d4dbf -[UIViewController view] + 51
10 UIKit 0x327347e5 -[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:] + 93
11 UIKit 0x32734783 -[UITabBarController transitionFromViewController:toViewController:] + 31
12 UIKit 0x327340bd -[UITabBarController _setSelectedViewController:] + 301
13 UIKit 0x327bd5d9 -[UITabBarController _tabBarItemClicked:] + 345
我在做什麼,現在,什麼工作,只是跟蹤我設置的NSUserDefaults
鍵,並在需要時手動刪除它們。但總有一種風險,我可能會忘記一個敏感的鑰匙,所以只需清除所有的NSUserDefaults
就可以讓我更加明智。所以,我想知道爲什麼我不能那樣做。這是一個錯誤還是我做錯了什麼?
如果您想了解更多信息,請告訴我!謝謝。
編輯:做[[NSUserDefaults standardUserDefaults] synchronize]
刪除後全部NSUserDefaults
沒有幫助。
顯示您在同一控制器中使用的更多代碼。 UIWebView是否依賴於首選項中存儲的任何值? – WrightsCS 2012-03-13 06:54:40
「EXC_CRASH」獨立於哪個控制器加載UIWebView而發生。我把所有的UIWebView包裝在'@try {} @catch {}'塊中,每一個都給了我相同的例外。我想不出任何UIWebView可能依賴的值,特別是在初始化時。如果你仍然喜歡一個包含UIWebView的控制器的代碼,請告訴我。 – cbrauchli 2012-03-13 07:04:47
是的,發佈任何和所有相關的代碼。 – WrightsCS 2012-03-13 16:35:05