iPhone - dealloc de Liberación frente a nil


Preguntándose si alguien con experiencia podría explicar esto un poco más. He visto ejemplos de...

  [view release];

  view = nil;  

....dentro del (vacío) dealloc.

¿Cuál es la diferencia y es uno mejor que el otro? ¿Cuál es la mejor manera?

Al hacer las pruebas de retainCount, personalmente he visto que nil reduce un conteo de 3 a 0 para mí, pero release solo lo reduce de 3 a 2.

Author: Srikar Appalaraju, 2009-09-22

5 answers

Lo que has visto es probablemente estos:

1) [foo release];
2) self.bar = nil;
3) baz = nil;
  1. Está liberando el objeto, accediendo a él a través de la variable de instancia foo. La variable de instancia se convertirá en un puntero colgante. Este es el método preferido en dealloc.

  2. Está asignando nil a una propiedad bar en sí mismo, que en la práctica liberará lo que la propiedad está reteniendo actualmente. Haga esto si tiene un configurador personalizado para la propiedad, que se supone que limpia más que solo la instancia variable que respalda la propiedad.

  3. Sobrescribirá el puntero baz que hace referencia al objeto con nil, pero no liberará el objeto. El resultado es una pérdida de memoria. Nunca hagas esto.

 36
Author: PeyloW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-20 19:51:21

Si no está utilizando propiedades (donde self.property = nil también liberará un objeto) entonces siempre debe seguir un release by code que establezca la referencia a nil, como lo describió:

[view release]; view = nil;

La razón es que evita la posibilidad de que se pueda usar una referencia que no sea válida. Es raro y difícil que ocurra, pero puede ocurrir.

Esto es aún más importante en viewDidUnload, si está liberando IBOutlets, ese es un escenario más realista donde una referencia podría ir mal debido a las advertencias de memoria descargando una vista, y luego algún otro código en la vista tratando de hacer uso de una referencia antes de que la vista se vuelva a cargar.

Básicamente es solo una buena práctica y le ahorrará un accidente en algún momento si se convierte en un hábito para hacer esto.

 8
Author: Kendall Helmstetter Gelner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-22 16:57:02

@bbullis22 ha visto la caída del recuento de restain de 3 a 0 porque estableció la referencia a nil. entonces pediste el retaincount de ' nil ' que es cero. sin embargo, el objeto que solía ser referenciado tiene el mismo retain count - 1 (debido a establecer la referencia a nil). al usar release, la referencia sigue haciendo referencia al mismo objeto, por lo que es por eso que ve que el recuento de retención disminuye de 3 a 2 en esta situación.

 2
Author: Remover,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-03 12:30:49

En cuanto al uso dentro de su código, en su dealloc no necesita la asignación a la propiedad, releasing es todo lo que necesita hacer.

- (void)dealloc {
    [myProperty release]; // don't need to assign since you won't have the object soon anyway
    [super dealloc];
}
 1
Author: Nick Bedford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-24 06:17:38

Creo que usar ambos es una especie de red de seguridad. Con solo release en su lugar, podría ejecutar un problema si atornilla la administración de conteo de referencias. Liberaría un objeto, devolviendo su memoria al sistema, pero el puntero seguiría siendo válido.

Con nil está garantizado que el programa no se bloqueará ya que enviar un mensaje a nil no hace nada.

 0
Author: Michal Sznajder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-22 05:12:23