Почему очистка NSUserDefaults вызывает EXC_CRASH позже при создании UIWebView?

Прежде чем я начну, я должен сказать вам, что это толькопроисходит в iOS 5.1. До самого последнего обновления такого никогда не было и до сих пор не происходит ни на одной другой версии. Тем не менее, вот что происходит.

Когда пользователь выходит из моего приложения, одна из вещей, которая происходит, заключается в том, что все NSUserDefaultsудаляются. Вместо того, чтобы вручную удалять каждый ключ, который я мог бы добавить к пользовательским значениям по умолчанию, я просто полностью удаляю все NSUserDefaults, используя метод, предложенный в этом вопросе SO :

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

Что кажется Однако случается, что каждый раз, когда я пытаюсь создать UIWebViewпосле удаления NSUserDefaults, я получаю EXC_CRASH (SIGABRT). Сбой происходит, когда я вызываю [[UIWebView alloc] initWithFrame:frame]. Странно, верно? Полный выход и повторное открытие приложения позволяет снова создать UIWebView.

Итак, мне удалось выяснить, что удаление значений по умолчанию вызовет проблему UIWebView, но чтобы быть уверенным, я добавил символическую точку останова для -[NSUserDefaults setObject:forKey:].

-[NSUserDefaults setObject:forKey:] breakpoint

Создание 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не помогает.

31
задан Community 23 May 2017 в 11:48
поделиться