1

可能重复:
为什么在创建 UIWebView 后清除 NSUserDefaults 会导致 EXC_CRASH?

**大家好,我在应用程序中有一个常见问题解答屏幕,这是 webview,该网页中有“给我发电子邮件”链接。单击此按钮时,将导航到 Mail Composer。但是应用程序仍然在后台运行。现在单击最小化的应用程序并单击相同的常见问题解答链接,应用程序崩溃。这只发生在 iOS 5.1 中。以下是收到的日志:

-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: WebKitLocalStorageDatabasePathPreferenceKey)

我在“APPDelegate”文件中使用了以下代码

NSDictionary *settings = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
    NSArray *keys = [settings allKeys];
    for (int i=0; i<[keys count]; i++)
    {
        NSString *key = [keys objectAtIndex:i];

        [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
    }
    [[NSUserDefaults standardUserDefaults] synchronize];
4

2 回答 2

0

试试下面的代码。NSUserDefaults以这种方式删除任何形式

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];



NSDictionary *userDefaultsDictionary = [userDefaults dictionaryRepresentation];

NSString *strWebDatabaseDirectory = [userDefaultsDictionary objectForKey:@"WebDatabaseDirectory"];

NSString *strWebKitLocalStorageDatabasePathPreferenceKey = [userDefaultsDictionary objectForKey:@"WebKitLocalStorageDatabasePathPreferenceKey"];



NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];



[userDefaults removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];



if (strWebDatabaseDirectory) {

    [userDefaults setObject:strWebDatabaseDirectory forKey:@"WebDatabaseDirectory"];}

if (strWebKitLocalStorageDatabasePathPreferenceKey) {

    [userDefaults setObject:strWebKitLocalStorageDatabasePathPreferenceKey forKey:@"WebKitLocalStorageDatabasePathPreferenceKey"];}



[userDefaults synchronize];

希望它可以帮助你。

于 2013-01-31T07:04:04.353 回答
0

这次崩溃不是因为版本更改。崩溃日志清楚地表明您正在尝试在 Dictionary 中插入 nil 值,这就是它崩溃的原因:

for (int i=0; i<[keys count]; i++)
{
     NSString *key = [keys objectAtIndex:i];
     if (key != nil)
          [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}

尝试上面的代码并检查。

于 2013-01-31T06:46:24.867 回答