У меня есть представление, содержащее UIWebView, который загружает карту google (так много javascript и т.д.). Проблема заключается в том, что если пользователь нажимает кнопку "назад" на панели навигации до того, как веб-представление закончит загрузку, мне не ясно, как аккуратно сообщить веб-обозревателю прекратить загрузку, а затем освободить ее, не получив сообщения, отправленные на освобожденный экземпляр. Я также не уверен, что веб-представление нравится, когда его контейнерный вид исчезает до его завершения (но у меня нет выбора, если пользователь нажимает кнопку "Назад" перед загрузкой).
В моем viewWillDisappear обработчик у меня есть это
map.delegate=nil;
[self.map stopLoading];
похоже, что он обрабатывает большинство случаев, так как ничтожество делегата не прекращает его отправку didFailLoadWithError в мой контроллер представления. Однако, если я выпущу веб-представление в своем методе dealloc, иногда (с перерывами), я все равно получаю сообщение, отправленное на освобожденный экземпляр, который, как представляется, связан с javascript, запущенным на фактической странице, например:
-[UIWebView webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:]: message sent to deallocated instance 0x4469ee0
Если я просто не освобожу веб-просмотр, то я не получаю эти сообщения, хотя, я думаю, я тогда утечка веб-просмотра.
Если я не отправлю сообщение "stopLoading" и просто отпустите веб-просмотр в viewWillDisappear, я увижу такие сообщения:
/SourceCache/WebCore/WebCore-351.9.42/wak/WKWindow.c:250 WKWindowIsSuspendedWindow: NULL window.
Возможно, я иногда (опять полностью прерывистый) получаю уродливый гейзенбуг, когда щелчок по кнопке "Назад" на каком-то другом навигаторе откроет название, но не представление. Другими словами, я остаюсь с заголовком представления n в стеке, но показ представления по-прежнему отображается n + 1 (в результате вы оказались в ловушке на этом экране и не можете вернуться к корневому представлению - вы можете пойти в другом направлении, т.е. нажимать больше просмотров и возвращаться к представлению, которое не срабатывало корректно, а не в корневом представлении. Единственный выход - выйти из приложения). В других случаях одна и та же последовательность нажатий и всплываний на одних и тех же представлениях отлично работает.
Этот конкретный меня заводит. Я думаю, что это может быть связано с исчезновением представления до того, как веб-просмотр загружен, т.е. В этом случае я подозреваю, что он может писать в память и путать стек представления. Или это может быть совершенно не связано и ошибка где-то еще (я никогда не мог воспроизвести ее в режиме отладки сборки, это происходит только с настройками сборки релиза, когда я не могу смотреть его с помощью gdb:-). Из моих отладочных запусков я не думаю, что я перевыпускаю что-нибудь. И я только, похоже, могу вызвать его, если в какой-то момент я попал в представление, имеющее веб-представление, и это происходит не сразу после этого.