私はグーグルマップをロードしているUIWebViewを含むビューを持っています(たくさんのjavascriptなど)。私が抱えている問題は、Webビューの読み込みが完了する前にユーザーがナビゲーションバーの「戻る」ボタンを押すと、Webビューに読み込みを停止してから解放するように、取得せずにきちんと指示する方法が明確でないことです。割り当て解除されたインスタンスに送信されるメッセージ。また、Webビューが、コンテナビューが完了する前に消えることを好むかどうかもわかりません(ただし、ユーザーがロードする前に戻るボタンを押すかどうかは選択できません)。
私のviewWillDisappearハンドラーで私はこれを持っています
map.delegate=nil;
[self.map stopLoading];
デリゲートをnilすると、ビューコントローラへのdidFailLoadWithErrorの送信が停止するため、これでほとんどの場合は問題なく処理されるようです。ただし、ビューのdeallocメソッドでWebビューを解放すると、場合によっては(断続的に)、実際のページで実行されているjavascriptに関連しているように見える、割り当て解除されたインスタンスにメッセージが送信されます。
-[UIWebView webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:]: message sent to deallocated instance 0x4469ee0
単にWebビューを解放しないと、Webビューがリークしていると思いますが、これらのメッセージは表示されません。
'stopLoading'メッセージを送信せず、viewWillDisappear内でWebビューを解放するだけの場合、次のようなメッセージが表示されます。
/SourceCache/WebCore/WebCore-351.9.42/wak/WKWindow.c:250 WKWindowIsSuspendedWindow: NULL window.
おそらく関連して、私は時々(再び完全に断続的に)醜いheisenbugを取得し、他のビューのナビゲーションバーの戻るボタンをクリックするとタイトルがポップされますが、ビューはポップされません。言い換えると、スタックにビューnのタイトルが残っていますが、表示されているビューは引き続きビューn + 1です(その結果、この画面に閉じ込められ、ルートビューに戻ることができません-他の方向、つまり、より多くのビューをプッシュして、正しくポップされなかったビューにポップバックします。ルートビューだけではありません。唯一の方法は、アプリを終了することです)。また、同じビューでの同じ一連のプッシュとポップが正常に機能する場合もあります。
この特定のものは私を狂わせています。これは、Webビューが読み込まれる前にビューが消えることに関連している可能性があります。つまり、この場合、メモリに落書きしてビュースタックを混乱させる可能性があると思います。または、これは完全に無関係であり、どこか別のバグである可能性があります(デバッグビルドモードで再現できなかったため、gdbで表示できない場合にのみリリースビルド設定で発生します:-)。デバッグの実行から、私は何も過剰にリリースしているとは思いません。そして、ある時点でWebビューのあるビューにヒットした場合にのみトリガーできるように見えますが、その直後には発生しません。