2011-11-02 5 views
5

Escribo la aplicación iOS y uso la biblioteca de imageStore para cargar imágenes en latencia y almacenarlas en caché en la memoria. (Https://github.com/psychs/imagestore)iOS verifique si el delegado existe antes del método de llamada

En ViewController puedo crear instancia Imagestore:

imageStore = [ImageStore new]; 
imageStore.delegate = self; 

Cuando imagen cargada exitosamente, el método delegado llamada Imagestore

- (void)imageStoreDidGetNewImage:(ImageStore*)sender url:(NSString*)url 

que hacer reloadData en la vista de tabla para redibujar celdas. Todo funciona bien. Pero existe el problema: si ViewController no se descargó (vuelva al controlador de navegación) y se cargó la imagen, la aplicación finaliza con el bloqueo, porque el método de descarga de la cámara del ViewController está descargado.

trato de hacer lo siguiente: 1) en ViewController coloco el código en la sección viewDidUnload:

imageStore.delegate = nil; 
imageStore = nil; 

2) En Imagestore agregué la comprobación de cero:

if(delegate != nil) { 
    ...call delegate method 
} 

Funciona, pero periódicamente se bloquea la aplicación de todos modos.

+0

'2)' es innecesario. El mensaje se puede enviar de forma segura al objeto 'nil'. – Nekto

+0

¡Gracias por la respuesta! pero sin que se cuelgue al 100% si la imagen se carga y el controlador de visualización se descarga ... –

Respuesta

12

Intenta poner este código en la sección dealloc.

imageStore.delegate = nil; 
imageStore = nil; 

De la misma manera la cláusula if no es necesario porque cualquier llamada a un objeto nulo es ignorado por la aplicación, por lo que si usted tiene algo como esto:

id delegate = nil;  
[delegate callAnyMethod]; 

no tiene ningún efecto en su comportamiento de la aplicación, en el otro lado, si la llamada del delegado método es opcional debe asure que el delegado responde al selector, algo como esto debe hacer el truco:

if([delegate conformsToProtocol:@protocol(yourProtocolName)] && [delegate respondsToSelector:@selector(imageStoreDidGetNewImage:url:)]) { 
     [delegate imageStoreDidGetNewImage:imageStore url:url]; 
} 

Salud!

0

Funciona, pero se cuelga periódicamente de todos modos.

Eso es una contradicción. Hay dos posibilidades:

  1. Tu reparación funcionó y la aplicación se bloquea por algún otro motivo.

  2. Su solución no funcionó, la aplicación sigue fallando por la misma razón por la que se había bloqueado anteriormente.

Es difícil saber cuál es el problema sin saber cuál de estas dos posibilidades está realmente sucediendo. Mire el mensaje de error y la evidencia del bloqueo, como el rastreo de la pila. ¿Por qué la aplicación se bloquea? ¿Intenta desreferenciar la propiedad delegate en algún lugar sin verificarla primero? ¿Depende de que el delegado haga algo, de modo que si el delegado ya no existe, esa cosa no se hace y eso a su vez provoca un colapso? Estos son los tipos de cosas que buscaría, pero una vez más, lo más importante es comenzar con la evidencia que tiene y seguir su nariz.

Cuestiones relacionadas