Avant de commencer, je dois vous dire que cela seulement qui se passe dans iOS 5.1. Avant la mise à jour plus récente, ce n'est jamais arrivé et il n'est toujours pas le cas sur toute autre version. Cela dit, voici ce qu'il se passe.
Lorsqu'un utilisateur se déconnecte de mon application, l'une des choses qui arrive, c'est que tous les de la NSUserDefaults
d'être supprimés. Plutôt que manuellement en supprimant toutes les clés que je pourrais ajouter à l'utilisateur par défaut, je viens de supprimer complètement tous les de la NSUserDefaults
, en utilisant la méthode proposée dans le présent DONC, la question:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
Ce qui semble se produire si, c'est que chaque fois que j'essaie de créer un UIWebView
, après avoir éliminé NSUserDefaults
, j'obtiens un EXC_CRASH (SIGABRT)
. Le crash se produit quand je l'appelle [[UIWebView alloc] initWithFrame:frame]
. Étrange droite? Complètement arrêter de fumer et la réouverture de l'application permet aux UIWebView
s à être créé de nouveau.
Donc, j'ai réussi à comprendre que la suppression d'un défaut serait la cause de la UIWebView
problème, mais pour être sûr, j'ai ajouté une symbolique point d'arrêt pour -[NSUserDefaults setObject:forKey:]
.
La création d'un UIWebView
n'est en effet déclencheur du point d'arrêt.
Piquer à travers le crash logs me donne l'exception de la raison:
-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: WebKitLocalStorageDatabasePathPreferenceKey)
Et voici le début de la trace de la pile:
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
Ce que je fais pour l'instant, et ce qui fonctionne, c'est juste de garder la trace de l' NSUserDefaults
clés, j'ai mis de les éliminer manuellement quand j'en ai besoin. Mais il y a toujours un risque que je l'oublie une clé sensible, donc, il suffit d'effacer tous NSUserDefaults
me semble plus raisonnable. Donc, je voudrais savoir pourquoi je ne peux pas le faire. Est-ce un bug ou ai-je fait quelque chose de mal?
Si vous voulez plus d'infos, faites le moi savoir! Merci.
EDIT: en Fait [[NSUserDefaults standardUserDefaults] synchronize]
après la suppression de tous les NSUserDefaults
n'aide pas.