porque - Se producen bloqueos aleatorios en mi proyecto de iPhone, vea dos pilas de llamadas, todas en núcleo web, todas se bloquean después de deshacerse de UIWebView
cómo bloquear llamadas de números desconocidos en iphone (2)
Antes de liberar la vista web, intente restablecer la carga de un delegado.
[webView stopLoading];
webView.delegate = nil;
[webView release];
webView = nil;
Se producen bloqueos aleatorios en mi proyecto de iPhone, veo dos pilas de llamadas, todas en núcleo web, todas se cuelgan después de desasignar UIWebView.
Consulte crash 1, parece que el núcleo web no puede cerrarlo completamente, ¿está bloqueado por otros subprocesos en ejecución?
Ver crash 2, ¿por qué todavía está lidiando con algunos problemas incluso si UIWebView ha sido lanzado?
Cualquier idea o discusión será apreciada, gracias de antemano.
Crash 2 tiene una tasa reproducible más alta que crash 1, escanea el código fuente de WebCore, parece que la memoria caché de manifiesto ha sido eliminada (¿quién lo hizo?) Cuando intenta acceder a ella.
Supongo que está configurando algún objeto (probablemente su controlador de visualización) como delegado de su webView, ya sea a través de Interface Builder o a través de un código que se ve así:
- (void)viewDidLoad
{
[super viewDidLoad];
self.webView.delegate = self;
}
- (void)dealloc
{
[self.webView release];
[super dealloc];
}
Este código tiene un error grave que no es inmediatamente obvio si no sabes qué buscar. ¿Puedes distinguirlo?
Cuando el controlador se desasigna, libera la vista web, pero esto no necesariamente significa que la vista web ya no existe. Todavía puede ser retenido por algún código dentro de su implementación interna, y aún puede estar cargando contenido.
Cuando termine de cargarse, la vista web llamará a un método como webViewDidFinishLoad:
en su delegado. El problema es que su controlador de vista era el delegado y su controlador de vista ya no existe. El sistema operativo ha recuperado la sección de memoria donde solía vivir el controlador de vista y ya no puede acceder a su proceso de solicitud. La vista web no lo sabe. Todavía tiene una referencia a esa dirección de memoria en su propiedad de delegado. Por lo tanto, intenta llamar a un método delegado en ese objeto, y grita ... EXC_BAD_ACCESS.
Los bloqueos como este parecen ser aleatorios ya que dependen de lo que su aplicación está haciendo en el fondo en ese momento. Esto los hace difíciles de diagnosticar. Afortunadamente son fáciles de resolver. Simplemente configure el delegado del objeto en nil antes de liberarlo en su instrucción dealloc, como esta:
- (void)dealloc
{
self.webView.delegate = nil;
[self.webView release];
[super dealloc];
}
Al configurar el delegado de la vista web en cero antes de liberarlo, usted garantiza que la vista web no intentará llamar a los métodos de delegado en su objeto una vez que se haya desasignado.
Si usa ARC, es posible que su clase no tenga un método dealloc. Eso normalmente está bien, pero en un caso como este deberías seguir y agregar uno. No desea llamar a la release
si está usando ARC, pero aún debe agregar un método dealloc y establecer la propiedad delegar en cero.
Para evitar bloqueos similares en el futuro, aplique esta mejor práctica cada vez que configure su objeto como el delegado de otro objeto.