A tiene un controlador de vista y crea un objeto "descargador", que tiene una referencia al controlador de vista (como un delegado). El descargador devuelve la llamada al controlador de vista si descarga el elemento correctamente. Esto funciona bien siempre y cuando permanezca en la vista, pero si se va antes de que la descarga se complete, obtengo EXC_BAD_ACCESS
. Entiendo por qué sucede esto, pero ¿hay alguna forma de verificar si un objeto todavía está asignado? Traté de probar usando delegate != nil
y [delegate respondsToSelector:]
, pero ahoga.Evitar EXC_BAD_ACCESS al usar el patrón de delegado
if (!self.delegate || ![self.delegate respondsToSelector:@selector(downloadComplete:)]) {
// delegate is gone, go away quietly
[self autorelease];
return;
}
else {
// delegate is still around
[self.delegate downloadComplete:result];
}
sé que podría,
a) han retener los objetos descargador el controlador de vista
b) mantener un conjunto de descargadores en el controlador de vista, y establecer sus valores de delegado a cero cuando Desbloqueo el controlador de vista.
Pero me pregunto si hay una manera más fácil, donde solo pruebo si la dirección del delegado contiene un objeto válido.
Si pudiera probar si una dirección contenía un objeto válido, por definición, lo haría, porque sería válido acceder a ella para probarla? –
objetivo-c tiene muchas abstracciones ... Puedo imaginarme un mundo donde el tiempo de ejecución fue capaz de distinguir entre una dirección con un objeto válido y una desasignada. –