2009-03-19 17 views
7

Si declaro las variables de clase en Objective-C, ¿cuándo se libera la memoria?variables de clase objetivo-c: ¿cuándo se llama a dealloc?

Si mi interfaz es:

@interface TestClass : NSObject 
{ 
} 

+ (NSString)instanceCount; 

@end 

Y en la implementación, declaro:

static NSString instanceCount; 

¿Cómo liberar esta variable nivel de clase? es decir, ¿cuándo se llama a dealloc para las variables de clase en Objective-C?

+3

Acabo de encontrar esta pregunta mientras aprendía Obj-C. Apple parece sugerir que no existe una "variable de clase" y que lo que ha definido en la interfaz es más bien un método de clase *, que es independiente de la variable estática y, por lo tanto, debe definirse en la implementación. La variable estática está limitada al alcance de la implementación * file *, no a la clase en sí misma. Tal vez esta es una pequeña objeción, pero me confundió por un segundo: http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocObjectsClasses.html#//apple_ref/doc/ uid/TP30001163-CH11-TPXREF118 –

Respuesta

10

La respuesta breve a su pregunta es: "cuando se cierra el programa".

Las variables estáticas se asignan al principio de su programa, antes de que comience la función main(). Del mismo modo, se lanzarán al final de su programa, poco después de las salidas main(). Esta gestión de la memoria es manejada por el tiempo de ejecución de Objective-C, y todo sucede detrás de las escenas.

Si está intentando controlar este comportamiento, probablemente no tenga mucha suerte. Por ejemplo, si se hizo lo siguiente en una clase personalizada, y luego utiliza esa clase como un miembro estático de otra clase:

- (void)dealloc 
{ 
    NSLog(@"I am being deallocated"); 
    [super dealloc]; 
} 

Usted nunca verá este mensaje aparecen en el registro. Hay un par de razones para esto. Uno, las variables que NSLog() requieren ya pueden haber sido desasignadas como parte del procedimiento de apagado normal. Y dos, porque el sistema de tiempo de ejecución simplemente puede liberar toda la memoria restante en una sola toma, sin molestarse en llamar a los métodos dealloc.

Esto puede ser problemático si su clase personalizada hace algo importante en su método dealloc. Si este es el caso, considere escribir un método personalizado cleanup que llame para estos objetos justo antes de que el programa salga.

+0

sin mencionar el hecho de que dealloc es un método de instancia y podría llamarse 0 o 100 veces para la clase – cobbal

+0

Hmm, sí, pero estaba pensando en este método en un objeto que se usó como un miembro estático de otra clase. He (con suerte) aclarado eso en mi respuesta. ¡Gracias por señalarlo! –

Cuestiones relacionadas