2010-11-18 8 views
7

Cuando asignamos memoria a una variable de clase, ¿debemos liberarla o establecerla en nil en el método dealloc? cual es la mejor practica?versión Vs nil - Best Practice

+0

puede aclarar lo que entendemos por "variable de clase"? – ohhorob

Respuesta

11

La mejor opción:

[foo release]; // ensures that memory is released 
foo = nil; // ensures that there is no dangling pointer to released memory 

Otras notas:

Cuando se asigna a una propiedad declarada para retener,

// in your .h 
@property (retain) MyObject *foo; 

// in your .m 
self.foo = bar; // bar is retained; whatever foo previously pointed at is released 

se dará a conocer lo que apuntaba anteriormente at y retener el nuevo objeto asignado.

Por lo tanto, se puede utilizar:

self.foo = nil; 

y se dará a conocer lo foo estaba señalando. Sin embargo, si su propiedad no fue declarada para conservar la semántica de almacenamiento, esto no liberará implícitamente lo que foo señale. Además, como señaló Ryan, una propiedad puede ser anulada para tener efectos secundarios. Por esta razón, lo mejor es seguir el patrón de siempre usando:

[foo release]; 

Para asegurarse de que no tiene una referencia colgante de memoria liberada, puede seguir esto con:

foo = nil; 

Si no está utilizando propiedades con conservar la semántica, que necesidad para liberar todo lo que se almacena en la variable:

[foo release]; 

EDIT: Véase también la siguiente respuesta a otra pregunta que explica esto:

iPhone - dealloc - Release vs. nil

+2

Es más seguro usar siempre: liberar en lugar de establecer la propiedad, ya que se pueden anular los establecedores para que tengan efectos secundarios. No quieres que ocurran efectos secundarios en tu método dealloc. – Ryan

+0

Gracias Ryan - Edité mi respuesta para reflejar esto. – Greg

+0

Excelente. ¡¡¡Gracias Señor!!! – Abhinav

Cuestiones relacionadas