【发布时间】:2012-03-13 06:10:34
【问题描述】:
在我开始之前,我应该告诉你这只发生在 iOS 5.1 中。在最近的更新之前,这从未发生过,并且在任何其他版本上仍然没有发生。也就是说,这就是发生的事情。
当用户退出我的应用程序时,发生的一件事是所有 NSUserDefaults 都被删除。我没有手动删除我可能添加到用户默认值的每个键,而是使用this SO question 中建议的方法完全删除所有NSUserDefaults:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
似乎发生的情况是,每次我在删除 NSUserDefaults 后尝试创建 UIWebView 时,都会得到一个 EXC_CRASH (SIGABRT)。当我拨打[[UIWebView alloc] initWithFrame:frame] 时发生崩溃。奇怪吧?完全退出并重新打开应用程序允许再次创建 UIWebViews。
所以,我设法弄清楚删除默认值会导致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 后执行 [[NSUserDefaults standardUserDefaults] synchronize] 无济于事。
【问题讨论】:
-
显示更多您在同一个控制器中使用的代码。 UIWebView 是否依赖于存储在首选项中的任何值?
-
EXC_CRASH发生独立于哪个控制器正在加载 UIWebView。我将所有 UIWebView 初始化都包装在@try{} @catch{}块中,每个都给了我同样的例外。我想不出 UIWebView 可能依赖的任何值,尤其是在初始化时。如果您仍然想要包含 UIWebView 的控制器中的一些代码,请告诉我。 -
是的,发布所有相关代码。
-
伙计,我不知道你是如何在 UIWebView 和 NSUserDefaults 之间建立联系的,但你只是为我节省了令人沮丧的 3 个小时
标签: iphone objective-c ios uiwebview nsuserdefaults