2015-07-20 18 views
10

ho provato tutti questi (one, two, three, four) soluzioni, ma dopo torno da schermata di visualizzazione web, per precedente viewController, si blocca per circa 2 secondi (a volte più). Non c'è nulla in viewWillAppear che causerà il blocco.UIWebView non fermarsi subito

Ecco viewWillDisappear di vista web regolatore:

-(void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [detailWebView stopLoading]; 
    detailWebView.delegate = nil; 
    NSLog(@"viewWillDisappear called !!!"); 
} 

Prima viewController:

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self.navigationController.navigationBar setBarTintColor:[UIColor colorWithRed:41.0/255.0 green:151.0/255.0 blue:132.0/255.0 alpha:1.0]]; 
    UIImage *imagePlus = [[UIImage imageNamed:@"create.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
    buttonCreate = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [buttonCreate setImage:imagePlus forState:UIControlStateNormal]; 
    [buttonCreate addTarget:self action:@selector(createActivity:) forControlEvents:UIControlEventTouchUpInside]; 
    buttonCreate.frame = CGRectMake(self.view.frame.size.width - 40, 10, 16, 16); 
    [self.navigationController.navigationBar addSubview:buttonCreate]; 
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"back", nil) style:UIBarButtonItemStylePlain target:nil action:nil]; 
    [backButton setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor blackColor]} forState:UIControlStateNormal]; 
    self.navigationItem.backBarButtonItem = backButton; 
    [self.navigationController.navigationBar setTintColor:[UIColor blackColor]]; 
} 

Aggiornamento: Ho appena confermato che se lascio il carico WebView completamente e poi andare a viewController precedente , non si osserva alcun congelamento.

+0

Sei sicuro '[detailWebView StopLoading];' è la causa del ritardo? Puoi commentare questo e poi controllare se funziona senza problemi –

+0

@InderKumarRathore: Appena controllato. stopLoading interrompe la webview, ma ci vuole ancora un po 'di tempo per fermarsi. – Nitish

+0

Stavo chiedendo di commentare questa riga e vedere se c'è qualche ritardo? –

risposta

3

Prova questa in viewWillDisappear:

-(void)viewWillDisappear:(BOOL)animated { 
    [detailWebView setDelegate:nil]; 
    [detailWebView loadRequest: [NSURLRequest requestWithURL: [NSURL URLWithString:@""]]]; 
    [detailWebView stopLoading]; 
    [super viewWillDisappear:animated]; 
} 
+0

Già provato. Non funziona. – Nitish

+0

Sì, viene chiamato. – Nitish

+0

No Mrunal, non ho. – Nitish

4

faccio la seguente, che è simile a quello che suggerisce @Mrunal ma carica una pagina valida. Inizialmente ho aggiunto questo per gestire una situazione in cui una pagina caricata aveva timer che continuavano a funzionare per sempre dopo essere tornati da UIWebView. Per me questo funziona bene.

- (void) viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 

    // Load a blank page as found things hang around. 
    [self.theWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 
} 

NB Io non chiamo stopLoading come che ferma la richiesta di carico. Questo potrebbe essere ciò che è sbagliato nella soluzione di Mrunal?

+0

Carichiamo '@" "' invece di 'about: blank' perché abbiamo notato che la memoria viene rilasciata in questo modo. –

3

Si sta utilizzando NSURLProtocol per intercettare le richieste Web da UIWebView? La risposta qui sotto è scritta su questa ipotesi.

Il caricamento della pagina Web comporta l'invio di richieste per più risorse (immagini, video, html, javascript). Ciascuna di queste risorse ha un URL che verrà intercettato da NSURLProtocol

Ora se si chiude la visualizzazione Web prima che tutte le risorse siano caricate, NSURLProtocol richiede a volte di cancellare tutte le richieste aperte per le risorse che sta intercettando e in questo processo di congelamento la tua app.

Annullerai la registrazione da NSURLProtocol prima di uscire da webView. Così

override func viewWillDisappear{ 
    NSURLProtocol.unregisterClass(/*your custom url protocol class name here*/) 
    } 

dovrebbe risolvere il problema di congelamento

PS: A volte si potrebbe avere NSURLProtocol definito per l'intera applicazione, in questo caso penso che sia meglio separare il NSURLProtocol per UIWebView dal resto della app . Non so molto del tuo progetto per me commentare se questa è un'opzione fattibile per te

3

Penso che la webview possa ancora essere elaborata in background. E ho fatto l'esperienza che è abbastanza fastidioso rilasciare un UIWebView completamente. Si potrebbe voler dare un'occhiata al Profiler: alzare e chiudere ViewController del webview più volte, il buffer dovrebbe aumentare costantemente.

Questo è il motivo per cui sono arrivato a unire diversi approcci di soluzione dallo stack overflow per rimuovere definitivamente tutto lo spazio di archiviazione da una visualizzazione Web e impedirne l'esecuzione.

È cruciale che la vista Web sia impostata su zero, per dirla veramente in memoria, in passato avevamo il metodo di rilascio, che ora è "obsoleto" se si utilizza l'ARC correttamente.

- (void)releaseWebView:(UIWebView *)webView 
{ 
    /* 

    There are several theories and rumors about UIWebView memory leaks, and how 
    to properly handle cleaning a UIWebView instance up before deallocation. This 
    method implements several of those recommendations. 

    #1: Various developers believe UIWebView may not properly throw away child 
    objects & views without forcing the UIWebView to load empty content before 
    dealloc. 

    Source: http://stackoverflow.com/questions/648396/does-uiwebview-leak-memory 

    */ 
    [webView loadHTMLString:@"" baseURL:nil]; 

    /* 

    #2: Others claim that UIWebView's will leak if they are loading content 
    during dealloc. 

    Source: http://stackoverflow.com/questions/6124020/uiwebview-leaking 

    */ 
    [webView stopLoading]; 

    /* 

    #3: Apple recommends setting the delegate to nil before deallocation: 
    "Important: Before releasing an instance of UIWebView for which you have set 
    a delegate, you must first set the UIWebView delegate property to nil before 
    disposing of the UIWebView instance. This can be done, for example, in the 
    dealloc method where you dispose of the UIWebView." 

    Source: UIWebViewDelegate class reference 

    */ 
    [webView setDelegate:nil]; 


    /* 

    #4: If you're creating multiple child views for any given view, and you're 
    trying to deallocate an old child, that child is pointed to by the parent 
    view, and won't actually deallocate until that parent view dissapears. This 
    call below ensures that you are not creating many child views that will hang 
    around until the parent view is deallocated. 
    */ 

    [webView removeFromSuperview]; 

    webView = nil; 
} 

Si prega di fare un tentativo e chiamare questo metodo in viewWillDisappear: