2010-05-16 13 views
7
pregunta

Aclaración como seguimiento a:Seguimiento viewDidUnload vs dealloc pregunta

What exactly must I do in viewDidUnload? When should I release objects in -(void)viewDidUnload rather than in -dealloc?

Así que digamos que hay un error de memoria baja, y la vista está oculto, y viewDidUnload se llama. Hacemos el lanzamiento y nada de baile. Más tarde, no se necesita toda la pila de vistas, por lo que se llama a dealloc. Como ya tengo el lanzamiento y nada en ViewDidUnload, no lo tengo en dealloc. Perfecto.

Pero si no hay ningún error de memoria, viewDidUnload nunca se llama. se llama a dealloc y como no tengo el lanzamiento y nada, hay una pérdida de memoria.

En otras palabras, ¿se llamará a dealloc sin que viewDidUnload se llame primero?

Y el seguimiento práctico de esto es, si aloco y configuro algo en viewDidLoad, y lo libero y coloco en nil en viewDidUnload, lo dejo fuera de dealloc, o hago un cheque nulo defensivo en dealloc y release/nil it si no es nulo?

+3

Usted sabe que puede enviar ningún mensaje de liberación sin problema, ¿no? nil simplemente ignora todos los mensajes que se le envían y devuelve nulo como valor sin ningún error. No es necesario realizar comprobaciones defensivas para nada como con NULL –

Respuesta

8

Libéralo en ambos. No necesita verificar si no tiene nil. Liberar en un nil no hace nada.

Sin embargo, en viewDidUnload no libere ivars que no pueda recrear fácilmente en viewDidLoad, en caso de que la vista se cargue de nuevo.

Normalmente (sin advertencias de memoria) no se llama a viewDidUnload, solo se llama a dealloc.

+0

Para una buena higiene, ¿debe hacerse un conjunto nulo en dealloc? – alyssackwan

+0

Para estar seguro, sí, pero solo puedo pensar en algunos casos en los que importa. Me gusta utilizar el setter para establecerlo en nil, ya que lo libera y lo establece en cero en una línea (es decir: self.ivar = nil;) – progrmr

+6

Realmente no hay razón para configurar ivars a 'nil' en' dealloc'. Además, está en contra de las recomendaciones de Apple utilizar setters en 'dealloc' (es decir,' self.ivar = nil'), ya que podría existir un problema al utilizar setters en un objeto parcialmente desasignado. Probablemente no sea un problema usar setters, pero para ser 100% seguro, puede usar '[ivar release]' en su lugar. – shosti

Cuestiones relacionadas