Prima di iniziare, dovrei dirti che questo solo avviene in iOS 5.1. Prima dell'aggiornamento più recente, questo non era mai successo e non si verifica ancora su nessuna altra versione. Detto questo, ecco cosa sta succedendo.Perché la cancellazione di NSUserDefaults causa EXC_CRASH in seguito durante la creazione di UIWebView?
Quando un utente si disconnette dalla mia app, una delle cose che succede è che tutti gli NSUserDefaults
vengono cancellati. Invece di rimuovere manualmente ogni chiave potrei aggiungere ai valori predefiniti dell'utente, ho appena completamente eliminare tutti i NSUserDefaults
, utilizzando il metodo suggerito in this SO question:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
quello che sembra accadere, però, è che ogni volta che cerco di creare un UIWebView
dopo aver rimosso NSUserDefaults
, ottengo un EXC_CRASH (SIGABRT)
. L'arresto si verifica quando chiamo [[UIWebView alloc] initWithFrame:frame]
. Strano, vero? Chiudere e riaprire completamente l'app consente di creare nuovamente UIWebView
s.
Quindi, sono riuscito a capire che la rimozione dei valori predefiniti avrebbe causato il problema UIWebView
, ma per essere sicuro, ho aggiunto un punto di interruzione simbolico per -[NSUserDefaults setObject:forKey:]
.
Creazione di un UIWebView
fa infatti scattare il punto di interruzione.
Frugando attraverso i log di crash mi dà la ragione eccezione:
-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: WebKitLocalStorageDatabasePathPreferenceKey)
Ed ecco l'inizio della traccia dello stack:
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
quello che sto facendo per ora, e ciò che funziona, è solo tenere traccia dei tasti NSUserDefaults
che ho impostato e rimuoverli tutti manualmente quando è necessario. Ma c'è sempre il rischio che io possa dimenticare una chiave sensibile, quindi semplicemente cancellare tutto NSUserDefaults
mi sembra più sensato. Quindi, vorrei sapere perché non posso farlo. È un bug o sto facendo qualcosa di sbagliato?
Se desideri ulteriori informazioni, fammelo sapere! Grazie.
MODIFICA: l'eliminazione di [[NSUserDefaults standardUserDefaults] synchronize]
dopo l'eliminazione di NSUserDefaults
non è di aiuto.
Mostra più codice che si sta utilizzando nello stesso controller. UIWebView dipende da qualsiasi valore memorizzato nelle preferenze? – WrightsCS
Il 'EXC_CRASH' succede indipendentemente da quale controller sta caricando UIWebView. Ho avvolto tutti gli UIWebView nei blocchi '@try {} @catch {}' e tutti mi danno la stessa eccezione. Non riesco a pensare a nessun valore su cui UIWebView possa dipendere, specialmente al momento dell'inizializzazione. Se desideri ancora un codice da uno dei controller contenenti UIWebView, fammelo sapere. – cbrauchli
sì, pubblica qualsiasi codice pertinente. – WrightsCS