EXC BAD ACCESS dans UIWebView
je viens de télécharger les rapports de crash pour une de mes applications iPhone depuis iTunes Connect. La plus courante crash a une trace comme suit:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0xa1b1c1db
Crashed Thread: 0
Thread 0 Crashed:
0 libobjc.A.dylib 0x3030e6f4 objc_msgSend + 16
1 UIKit 0x30ebebee -[UIWebView webView:resource:didFinishLoadingFromDataSource:]
2 UIKit 0x30ebe5ca -[UIWebViewWebViewDelegate webView:resource:didFinishLoadingFromDataSource:]
3 CoreFoundation 0x32b73b5c __invoking___ + 60
4 CoreFoundation 0x32bc67be -[NSInvocation invoke]
5 WebCore 0x320baa86 HandleDelegateSource
6 CoreFoundation 0x32bb8a96 CFRunLoopRunSpecific
7 CoreFoundation 0x32bb8356 CFRunLoopRunInMode
8 GraphicsServices 0x30544cd4 GSEventRunModal
9 GraphicsServices 0x30544d80 GSEventRun
10 UIKit 0x30d2c768 -[UIApplication _run]
11 UIKit 0x30d2b46c UIApplicationMain
je suis sûr à 80% qu'il s'agit d'un problème interne à UIWebView et en dehors de la portée de ce que je peux aborder. Est-ce que quelqu'un a des suggestions sur la façon de réduire cette question pour aider à déterminer si c'est un problème avec le système D'exploitation et UIWebView, ou un problème que je peux corriger et adresser dans mon code? Grâce à avance.
mise à jour: L'UIWebView en question Est dans une vue qui est libérée lorsque l'utilisateur appuie sur le bouton back du contrôleur de navigation correspondant. La solution acceptée semble fournir une bonne explication de la raison de cette erreur.
avant la solution suggérée:
- (void)dealloc {
[webView release];
[super dealloc];
}
après la solution suggérée:
- (void)dealloc {
webView.delegate = nil;
[webView stopLoading];
[webView release];
[super dealloc];
}
5 réponses
Le scénario va quelque chose comme ceci:
- L'utilisateur entre l'écran avec
UIWebView
.UIViewController
configureself
en tant que délégué - page Web commence à télécharger
- écran de sortie de L'utilisateur
3a.
UIViewController
obtient désalloué UIWebView
termine le chargement et envoie le message "j'ai fini" à son délégué...
Vous devez arrêter le UIWebView
de charger sa page et fixe son délégué à zéro avant de désallouer le délégué.
c'est presque 100% une erreur dans votre code. Les erreurs dans le SDK iPhone sont assez rares et UIWebView
a été testé assez bon par beaucoup d'autres développeurs.
EXC_BAD_ACCESS
se produit habituellement lorsque vous essayez d'accéder à un objet déjà libéré. Évidemment, si le code D'Apple essaie de le faire, vous êtes celui qui a publié l'objet à tort. Êtes-vous sûr que vous n'avez pas de -autorelease
ou -release
trop?
j'ai récemment eu un problème similaire où mes applications se sont écrasées au hasard. Il s'avère que le problème était d'utiliser "onclick=
" dans le HTML chargé.
remplacé le onclick
avec simple <a href="javascript:some_script">
et le problème a disparu.
Espérons que cela aide d'autres personnes qui rencontrent le même problème avec webviews
.
jetez un coup d'oeil à l'intérieur de la chose dans votre code qui implémente le UIWebViewDelegate
protocole. En particulier, vous voulez regarder ce qui manipule webViewDidFinishLoad:
Vous essayez d'accéder à une variable qui est libéré. Postez la source complète si vous le pouvez, Qui nous aidera à trouver pour vous.
j'ai eu un problème similaire. J'ai été en utilisant:
[webView loadHTMLString:str baseURL:tmpUrl];
[str release];
la publication de "str" a causé le message D'erreur "EXC_BAD_ACCESS"