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];
}
26
demandé sur Aaron 2009-10-05 19:07:38

5 réponses

Le scénario va quelque chose comme ceci:

  1. L'utilisateur entre l'écran avec UIWebView. UIViewController configure self en tant que délégué
  2. page Web commence à télécharger
  3. écran de sortie de L'utilisateur 3a. UIViewController obtient désalloué
  4. 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é.

57
répondu Stephen Darlington 2009-10-05 15:34:47

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?

1
répondu Georg Schölly 2009-10-05 15:13:36

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.

1
répondu Cesar Lou 2016-11-10 13:26:05

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.

0
répondu slf 2009-10-05 15:21:25

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"

0
répondu axe 2012-01-05 13:18:08