J'ai une vue contenant un UIWebView qui charge une carte google (donc beaucoup de javascript etc). Le problème que j'ai est que si l'utilisateur appuie sur le bouton 'back' de la barre de navigation avant que la vue web n'ait fini de se charger, il n'est pas clair pour moi comment dire à la vue web d'arrêter de se charger et ensuite de la libérer, sans avoir des messages envoyés à l'instance désallouée. Je ne suis pas non plus certain qu'une vue web apprécie que son conteneur disparaisse avant la fin de son chargement (mais je n'ai pas le choix si l'utilisateur appuie sur le bouton "retour" avant que le chargement ne soit terminé).
Dans mon gestionnaire viewWillDisappear, j'ai ceci
map.delegate=nil;
[self.map stopLoading];
cela semble gérer la plupart des cas sans problème, puisque le fait de mettre le délégué à zéro l'empêche d'envoyer le didFailLoadWithError à mon contrôleur de vue. Cependant, si je libère la vue web dans la méthode dealloc de ma vue, il arrive (par intermittence) que je reçoive toujours un message envoyé à l'instance deallocated, qui semble être lié au javascript exécuté dans la page actuelle, par exemple :
-[UIWebView webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:]: message sent to deallocated instance 0x4469ee0
Si je ne libère pas le webview, je n'obtiens pas ces messages, mais je suppose que je libère alors le webview.
Si je n'envoie pas le message "stopLoading" et que je libère simplement le webview dans viewWillDisappear, je vois des messages comme celui-ci :
/SourceCache/WebCore/WebCore-351.9.42/wak/WKWindow.c:250 WKWindowIsSuspendedWindow: NULL window.
Peut-être lié à cela, j'ai parfois (encore une fois de manière totalement intermittente) un heisenbug hideux où le fait de cliquer sur le bouton retour de la barre de navigation d'une autre vue fait apparaître le titre, mais pas la vue. En d'autres termes, je me retrouve avec le titre de la vue n sur la pile, mais la vue affichée est toujours la vue n+1 (le résultat est que vous êtes piégé sur cet écran et ne pouvez pas revenir à la vue racine - vous pouvez aller dans l'autre sens, c'est-à-dire pousser plus de vues et revenir à la vue qui ne s'est pas affichée correctement, mais pas à la vue racine. La seule façon de s'en sortir est de quitter l'application). À d'autres moments, la même séquence de poussées et de projections sur les mêmes vues fonctionne bien.
Celui-là en particulier me rend fou. Je pense qu'il peut être lié au fait que la vue disparaît avant que la vue web ne soit chargée, c'est-à-dire que dans ce cas, je soupçonne qu'il peut gribouiller sur la mémoire et confondre la pile de vues. Ou bien, cela pourrait n'avoir aucun rapport et être un bogue ailleurs (je n'ai jamais été capable de le reproduire en mode de construction de débogage, cela ne se produit qu'avec les paramètres de construction de version lorsque je ne peux pas le regarder avec gdb :-). D'après mes tests de débogage, je ne pense pas que je libère trop de choses. Et je ne semble pouvoir le déclencher que si, à un moment donné, j'ai touché la vue qui contient la vue Web, et que cela ne se produit pas immédiatement après.