在我开始之前,我应该告诉你,这个只有发生在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