У меня есть представление, содержащее UIWebView, который загружает карту Google (так много javascript и т. Д.). У меня проблема в том, что если пользователь нажимает кнопку «назад» на панели навигации до того, как веб-представление завершит загрузку, мне не понятно, как аккуратно сказать веб-представлению прекратить загрузку, а затем отпустить его, не получая сообщения, отправленные на освобожденный экземпляр. Я также не уверен, что веб-представлению нравится, когда его контейнерное представление исчезает до его завершения (но у меня нет выбора, если пользователь нажимает кнопку «Назад» перед загрузкой).
На мой взгляд обработчик исчезновения / исчезновения У меня есть этот
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 :-). Из моих отладочных прогонов я не думаю, что переиздаю что-либо. И я, кажется, могу запустить его, только если в какой-то момент я нажал на представление, имеющее веб-представление, и это не произойдет сразу после этого.