在我开始之前,我应该告诉你这只发生在iOS 5.1中。在最近的更新之前,从未发生过,也不会在任何其他版本上发生。话虽如此,这是发生了什么。
当用户注销我的应用程序时,会发生其中一件事情,即所有的
当用户注销我的应用程序时,会发生其中一件事情,即所有的
NSUserDefaults
都被删除。我不想手动删除每个密钥,因此我只是完全删除了所有的NSUserDefaults
,使用了这个SO问题中建议的方法。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
似乎更明智。因此,我想知道为什么我不能这样做。这是一个bug还是我做错了什么?
如果您需要更多信息,请告诉我!谢谢。
编辑:删除所有NSUserDefaults
后执行[[NSUserDefaults standardUserDefaults] synchronize]
也无效。
EXC_CRASH
发生的独立于哪个控制器正在加载 UIWebView。我将所有 UIWebView 的初始化包装在@try{} @catch{}
块中,每一个都给我相同的异常。我无法想象 UIWebView 可能依赖于任何值,特别是在初始化时。如果您仍然希望从包含 UIWebView 的控制器中获取一些代码,请告诉我。 - cbrauchli