Как безопасно закрыть загружающийся UIWebView в viewWillDisappear?

Проблема возникает из-за того, что namespace в mapper xml имеет значение com.qlsdistribution.fps.resolverender.data.mybatis.ResolveJobReportMapper, а интерфейс интерфейса mapper - com.qlsdistribution.fps.resolverender.data.mybatis.mapper.ResolveJobReportMapper.

Чтобы исправить это, убедитесь, что они совпадают.

31
задан Alex Reynolds 2 May 2009 в 09:56
поделиться

6 ответов

Вариант этого должен исправить проблемы с утечками и зомби:

- (void)loadRequest:(NSURLRequest *)request
{
    [self retain];
    if ([webView isLoading])
        [webView stopLoading];
    [webView loadRequest:request];
    [self release];
}
- (void)webViewDidStartLoad:(UIWebView *)webView
{
    [self retain];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [self release];
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    [self release];
}

- (void)viewWillDisappear
{
    if ([webView isLoading])
        [webView stopLoading];
}

- (void)dealloc
{
    [webView setDelegate:nil];
    [webView release];
    [super dealloc];
}
53
ответ дан 27 November 2019 в 22:17
поделиться

Простого сообщения release в dealloc должно быть достаточно.

Ваша вторая проблема звучит так преждевременно освобожденное представление, но я не могу сказать много, не видя некоторого кода.

0
ответ дан 27 November 2019 в 22:17
поделиться

Есть несколько способов справиться с этим, но это должно сработать. Вам нужно сообщение didFailLoadWithError, это то, что говорит вам, что оно остановлено.

Установите флаг isLeaving = YES; Отправьте веб-просмотр stopLoading.

В didFailLoadWithError: проверьте наличие ошибки, которую вы получаете, когда веб-просмотр прекращается:

if ((thiserror.code == NSURLErrorCancelled) && (isLeaving == YES)) {

[otherClass executeSelector: @selector (shootWebview) withObject: nil withDelay: 0]

}

выпустить веб-вид в ShootWebview:


вариантов: если вы хотите быть кавалернее об этом, вы можете сделать executeSelector: withObject: withDelay: с задержкой [fillintheblank], назвать его 10-30 секунд без проверки, и вы почти наверняка сойдете с рук, хотя я не Не рекомендую.

Вы можете сделать так, чтобы didFailLoadWithError установил флаг и очистил его где-нибудь еще.

или мой любимый, возможно, вам не нужно освобождать его все, когда вы уходите. Вы когда-нибудь снова отобразите этот контейнер? почему бы не использовать его повторно?

Ваша отладка отличается от выпуска, вы можете проверить свою конфигурацию, чтобы убедиться, что она точно такая же. Баунти был на воспроизводимой части вопроса, верно? ; -.)

- О, подождите секунду, вы можете удалить весь контейнер View с помощью WebView. Вы можете сделать вариант выше и подождать, чтобы освободить весь контейнер в shootWebView.

1
ответ дан 27 November 2019 в 22:17
поделиться

Ошибка UINavigationController, которую вы описываете во второй части сообщения, может быть связана с обработкой вами предупреждений о памяти. Я испытал это явление, и мне удалось воспроизвести его в представлении n в стеке, смоделировав предупреждение памяти при просмотре представления (n + 1) в стеке.

UIWebView - пожиратель памяти, поэтому получение памяти предупреждения не будут удивительными, если они будут использоваться как часть иерархии представлений.

1
ответ дан 27 November 2019 в 22:17
поделиться

У меня была аналогичная проблема с использованием UIWebView в OS3 - это описание было хорошей отправной точкой, однако я обнаружил, что просто обнуление делегата веб-представления перед выпуском webView решило мои проблема.

Чтение примера кода (принятый ответ - выше) - кажется излишним. Например, строки [webView release] и webView = nil делают то же самое, учитывая то, как автор описывает объявленную переменную (так что вам не нужны оба). Я также не полностью убежден в том, что все линии удержания и выпуска - но я предполагаю, что ваш опыт будет отличаться.

0
ответ дан 27 November 2019 в 22:17
поделиться

Возможно, связаны, иногда я (снова полностью прерывистый) получить уродливый heisenbug, где щелкнул спину кнопка на панели навигации другого представления появится заголовок, но не вид. Другими словами, я остаюсь с заголовок просмотра n в стеке, но просмотр по-прежнему вид n + 1 ( результат - вы в ловушке на этом экран и не могу вернуться в корень вид - можно пойти в другую сторону, т.е. нажмите больше просмотров и вернитесь к вид, который не появился правильно, просто не в корневом представлении. Единственный выход - выйти из приложения). В другом раз та же последовательность толчков и pops on the same views works fine.

I have the same problem, when I'm use navigation controller with view controllers in stack > 2 and current view controller index > 2, if an memoryWarning occurs in this momens, it raises the same problems.

There is inly 1 solution, which I found after many experiments with overriding pop and push methods in NavigationController, with the stack of view controllers, with views and superviews for stacked ViewControllers, etc.

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@interface FixedNavigationController : 
UINavigationController <UINavigationControllerDelegate>{

}

@end

#import "FixedNavigationController.h"

static BOOL bugDetected = NO;

@implementation FixedNavigationController

- (void)viewDidLoad{
    [self setDelegate:self];
}

- (void)didReceiveMemoryWarning{
    // FIX navigationController & memory warning bug
    if([self.viewControllers count] > 2)
        bugDetected = YES;
}

- (void)navigationController:(UINavigationController *)navigationController 
didShowViewController:(UIViewController *)viewController 
animated:(BOOL)animated
{

    // FIX navigationController & memory warning bug
    if(bugDetected){
        bugDetected = NO;

        if(viewController == [self.viewControllers objectAtIndex:1]){
            [self popToRootViewControllerAnimated:NO];
            self.viewControllers = [self.viewControllers arrayByAddingObject:viewController];
        }
    }
}

@end

It works fine for 3 view controllers in stack.

0
ответ дан 27 November 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: