2011-08-03 19 views
5

estoy leyendo a través del libro de Big Nerd Ranch en la programación iOS y que tenía una pregunta sobre el programa Hypnotime crean en el capítulo 7.iOS gestión de memoria básica

En algún momento, que poner en práctica el método siguiente:

- (void)showCurrentTime:(id)sender 
{ 
    NSDate *now = [NSDate date]; 

    static NSDateFormatter *formatter = nil; 

    if (!formatter) { 
     formatter = [[NSDateFormatter alloc] init]; 
     [formatter setTimeStyle:NSDateFormatterShortStyle]; 
    } 

    [timeLabel setText:[formatter stringFromDate:now]]; 

} 

Mi pregunta es acerca de NSDateFormatter *formatter. El formateador se crea con alloc y init. Siempre supe que cualquier cosa con alloc necesita ser lanzada en algún lado, ¿verdad? Cuando formatter pasa a timeLabel, no lo envía a timeLabelretain? Y no puedo (¿no debería?) Posteriormente, lancé formatter?

he echado un vistazo a través del código en el próximo par de páginas y no puedo encontrar ningún mensaje de liberación en cualquier lugar, a excepción de un release siendo enviar a timeLabel en dealloc.

¿Estoy mezclando cosas aquí? ¿Hay alguna razón por la cual formatter no deba ser revelada por mí? Quiero ser un buen ciudadano de la memoria. Se agradece cualquier ayuda :)

Respuesta

1

declararon el formateador como estática por lo que la intención es mantener el formateador vivo durante toda la vida útil de la aplicación. Esto sería por razones de rendimiento y puede ser una optimización pre-madura, así que no tome esto como una mejor práctica en su propio desarrollo futuro.

//static (even in a method) will allow formatter to live during entire app lifecycle 
static NSDateFormatter *formatter = nil; 

//Check if formatter has been set (this is not thread safe) 
if (!formatter) { 
    //Set it once and forget it, it wont be a leak, and it wont ever be released 
    formatter = [[NSDateFormatter alloc] init]; 
    [formatter setTimeStyle:NSDateFormatterShortStyle]; 
} 
+0

Gracias por el consejo. Si se mantiene activo durante toda la vida útil de la aplicación, ¿significa eso que debería liberarlo en dealloc o no liberarlo? Un poco confundido acerca de esto, para ser honesto. – cabaret

+0

No, no está diseñado para ser liberado y no creará una pérdida de memoria a menos que asigne el formateador nuevamente sin soltarlo primero. Es por eso que hay un cheque si. – Joe

+0

De acuerdo, creo que lo entiendo. Muchas gracias. – cabaret

1

setText acaba de recibir una cadena (no el formateador en sí), por lo que el formateador no se conserva. Mi apuesta es que usan el formateador en otro lugar en el controlador y así se libera en dealloc

+0

no les importa la parte dealloc, no vio que era estático, pero la primera parte sigue siendo cierto – ksn

+0

bien, gracias. Lo tendré en cuenta acerca de setText. :) – cabaret

2

Debido a la palabra clave static el formatter estará disponible hasta la próxima vez que se llame al método, como una variable global, bueno, sin siendo

entrada global Ver Wikipedia static

+0

Gracias por la respuesta rápida. La entrada del wiki borró algunas cosas sobre 'static' up :) – cabaret

Cuestiones relacionadas