UIWebView no se detiene de inmediato

He intentado todas estas ( una , dos , tres , cuatro ) soluciones, pero después de volver de la pantalla de vista web a viewController anterior, se congela durante unos 2 segundos (a veces más). No hay nada en la vista que aparezca que provocará la congelación.

Aquí está la vista: viewWillDisappear del controller de vista web:

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

Primer 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]]; } 

Actualización : Acabo de confirmar que si dejo que la carga de WebView se cargue por completo y luego vaya a viewController anterior, no se observará ninguna congelación.

Hago lo siguiente, que es similar a lo que @Mrunal sugiere, pero carga una página válida. Originalmente agregué esto para hacer frente a una situación en la que una página cargada tenía timeres que continuaban ejecutándose para siempre después de aparecer de nuevo desde un UIWebView. Para mí esto funciona bien.

 - (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 No llamo stopLoading ya que detiene la request de carga. ¿Esto podría ser lo que está mal con la solución de Mrunal?

¿Estás utilizando NSURLProtocol para interceptar las requestes web desde tu UIWebView? La respuesta a continuación está escrita en esa suposition.

La carga de la página web implica enviar requestes de múltiples resources (imágenes, videos, html, javascript). Cada uno de esos resources tiene una URL que será interceptada por el NSURLProtocol

Ahora, si cierra la vista web antes de que se carguen todos los resources, NSURLProtocol tarda a veces para cancelar todas las requestes abiertas de resources que está interceptando y en este process congelar su aplicación.

Desmarcará de NSURLProtocol antes de salir de webView. Asi que

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

debe solucionar el problema de congelación

PS: A veces es posible que tenga NSURLProtocol definido para toda la aplicación, en cuyo caso creo que es mejor separar el NSURLProtocol para UIwebView del rest de la aplicación. No sé mucho sobre su proyecto para que yo pueda comentar si esta es una opción factible para usted

Intente esto en viewWillDisappear . viewWillDisappear :

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

Creo que la vista web aún puede procesarse en segundo plano. E hice la experiencia de que es bastante molesto lanzar un UIWebView por completo. Es posible que desee echar un vistazo en el Perfilador: sube y cierra el ViewController de la vista web varias veces, el almacenamiento intermedio debe boost constantemente.

Esta es la razón por la que he llegado a fusionar varios enfoques de solución desde el desbordamiento de stack para finalmente eliminar por completo todo el almacenamiento de una vista web y también evitar que se ejecute.

Es crucial que la vista web esté configurada como nula, para realmente desasignar su memory, en el pasado teníamos el método de liberación, que ahora es "obsoleto" si usas el ARC correctamente.

 - (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; } 

Por favor, pruébelo y llame a este método a la vista. Desaparecerá: