UIWebView tomando mucha memory

En mi aplicación cuando carga UIWebView con cualquier url del website, la memory salta de 30 mb a alnetworkingedor de 140 mb. Estoy usando ARC

aquí está la imagen para el mismo
y al descartar el UIWebViewController [ Viewcontroller que contiene UIWebView], no libera la memory. ¿Puede algún cuerpo ayudarme a resolver estos problemas de memory y, por favor, también me proporciona indicadores de las mejores prácticas de memory en ARC

Para cargar la página web:

 NSURL *nsurl=[NSURL URLWithString:self.url]; NSURLRequest *nsrequest=[NSURLRequest requestWithURL:nsurl]; [webview loadRequest:nsrequest]; 

Para descartar el controller de vista:

 [self dismissViewControllerAnimated:YES completion:^{ webview.delegate=nil; webview=nil; }]; 

Gracias por adelantado 🙂

wow, hoy también nos encontramos con este problema. cuando intentamos cargar una página web que contiene muchas imágenes o una gran página web, es fácil que se bloquee. También encontramos que la memory usó casi 200M.

finalmente encontramos que podríamos eliminar el caching de memory de la vista web

 [[NSURLCache shanetworkingURLCache] removeAllCachedResponses]; 

Puedes probarlo cuando recibas una advertencia de memory. o puede llamarlo en el método dealloc.

Si aún tiene algunos problemas, intente limitar el tamaño del caching de memory por llamada

 [[NSURLCache shanetworkingURLCache] setMemoryCapacity:size] 

¡buena suerte!

No los escuches,

No es un problema, los teléfonos pueden manejar todo ese uso de memory, intente usar un MKMapView y vea cómo su uso de memory se disparó.

En su simulador, trate de pasar por una advertencia de memory baja cmd+shift+m , y vea lo que sucede, no puede esperar que todas las vistas web se ejecuten con el mismo uso de memory, también, ha dado una oportunidad para que su teléfono se bloquee todo fuera

Los iPhones pueden manejar todo eso, por lo que no debes preocuparte mucho al respecto.

Pero intente esto de todos modos:

El comportamiento de UIWebViews cambia si desmarca "Detecta enlaces" en el file nib, así que trate de alternar eso y vea qué sucede.

  • Use la pestaña de asignación de instrumentos para ver la cantidad de instancias de su UIWebViewController en vivo en la memory. (Cmd + I en Xcode, deje Instruments abiertos, select Asignaciones y escriba UIWebViewController en la barra de búsqueda)
  • Si hay más de lo que espera que sea, busque un ciclo de retención.
  • Trate de usar references débiles dentro de bloques en lugar de uno mismo.
  • Asegúrese de no tener una fuerte reference al object UIWebViewController en más de un lugar.
  • Coloque un punto de interrupción / NSLog en el método dealloc de su viewController para ver si se le llama.

No tiene sentido search un problema hasta que esté seguro de que existe un problema.

Hay dos posibilidades por las que el uso de memory es tan alto:

1.UIWebView no se desasigna.

2.Es un sistema de almacenamiento en caching o algún algorithm de procesamiento de memory iOS específico.

En el segundo caso, no puedes hacer nada. Para verificar el primer caso, puede intentar utilizar instrumentos o simplemente subclass UIWebView y agregar logging al método dealloc.

 @implementation MyUIWebView - (void)dealloc { NSLog(@"MyUIWebView deallocated!"); } @end 

No olvide cambiar UIWebView a MyUIWebView en su código.

Y solo si está seguro de que UIWebView no está desasignado, debería comenzar a search pointers fuertes, retener círculos, etc.

añadir

 if (webView.isLoading){ webView.stopLoading; } webView.delegate=nil; 

antes de esta linea

 [self dismissViewControllerAnimated:YES completion...] 

La ARC no debe ocultar su webView. No haga reference a la vista web en el bloque de finalización.

Creo que olvidó quitar UIWebView de la jerarquía de vistas. Esto provocaría un recuento adicional de retención y evitaría que se recupere la memory cuando no salga de la propiedad.

Solo algunas cosas que debes revisar:

  • Un controller tiene una strong reference a su view , y esta vista conserva todas las subvistas siempre que las mantenga dentro de la jerarquía de vistas, por lo que cualquier propiedad adicional debería ser weak , incluida su propiedad webView .
  • Cuando se usa ARC no hay necesidad de "nada" de todo. ARC dealloc todas sus references strong en dealloc automáticamente.
  • No hay necesidad de hacer nada con references weak tampoco. Además, en iOS 5+, weak references weak vuelven nil automáticamente si el object referencedo se desasigna en otro lugar.

Creo que lo más probable es que todo el controller de vista se retenga en alguna parte y, por lo tanto, su view y la view webView .

Asegúrese de que solo guarde references weak al controller y deje que sea retenido por un contenedor o que presente un controller para que se libere automáticamente siempre y cuando se muestre o salga.

Estaba teniendo el mismo problema en mi request. Recomendaría que use WKWebView. WKWebView se presentó con iOS 8. Puede leer más sobre esto aquí, documentation de la manzana

El problema de la memory definitivamente se resuelve. Obtendrá toda la funcionalidad de la vista web y algo más (es decir, el progreso). Espero que esto ayude

Si desea networkingucir el uso de memory de UIWerview inmediatamente, puede intentar:

1.

 [webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 

o

2.

 [webview loadHTMLString: @"" baseURL: nil]; 

o

3.

 [webview loadData:nil MIMEType:nil textEncodingName:nil baseURL:nil]; 

Me funcionó