2009-02-16 10 views
42

Sto guardando il seguente codice sorgente di esempio mela:Utilizzando parola chiave static in Objective-C quando si definisce una variabile memorizzata nella cache

/* 
Cache the formatter. Normally you would use one of the date formatter styles (such as NSDateFormatterShortStyle), but here we want a specific format that excludes seconds. 
*/ 
static NSDateFormatter *dateFormatter = nil; 
if (dateFormatter == nil) { 
    dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"h:mm a"]; 
} 

Cercando di capire:

  • Perché utilizzare la statica parola chiave?

  • Come questo equivale a una variabile memorizzata nella cache se si imposta su nil ogni volta che viene chiamato il metodo.

Il codice è da esempio 4 nel Tableview Suite demo

risposta

62

Le variabili statiche mantengono i loro valori assegnati rispetto alle chiamate ripetute alla funzione. Sono fondamentalmente come valori globali che sono solo "visibili" a quella funzione.

Tuttavia, l'istruzione di inizializzazione viene eseguita solo una volta.

Questo codice inizializza dataFile a zero la prima volta che si utilizza la funzione. Ad ogni successiva chiamata alla funzione viene effettuato un controllo in base al valore di dateFormatter. Se non è impostato (che sarà vero solo la prima volta) viene creata una nuova data. Se è impostato, verrà invece utilizzata la variabile dataFormatter statica.

Vale la pena familiarizzare con le variabili statiche. Possono essere molto convenienti ma hanno anche aspetti negativi (in questo esempio è impossibile rilasciare l'oggetto dateFormatter, ad esempio).

Solo un suggerimento: a volte può essere educativo inserire un punto di interruzione nel codice e dare un'occhiata per vedere cosa sta succedendo. Con l'aumento della complessità dei tuoi programmi diventerà un'abilità inestimabile.

+1

Ciao @Andrew Grant, spiegazione molto bella, In questo caso, come hai detto, è impossibile rilasciarlo, supponiamo che voglio rilasciarlo e assegnare un nuovo valore alla formattazione di data, quindi come dovrebbe essere fatto. – Ranjit

16

"static" significa funzionalmente "Non valutare la roba sul lato destro del segno di uguale ogni volta attraverso, utilizzare il suo valore precedente, invece" in questo caso.

Usa questa grande potenza con grande responsabilità: corri il rischio di usare tutta una tonnellata di memoria, poiché questi sono oggetti che non vanno mai via. È raramente appropriato, ad eccezione di casi come questo con NSDateFormatter.

+10

so che questa è una vecchia domanda, ma mi chiedo l'impatto di questa parola chiave statica in relazione con ARC? – codejunkie

+3

Le statistiche @codejunkie sono archiviate in una posizione diversa dall'heap. Le preoccupazioni ARC conservano e rilasciano la memoria heap in modo che i valori possano persistere oltre i frame dello stack. Pertanto, dubito che l'ARC abbia qualche effetto sulle variabili statiche. – smileBot

1

Per gli scopi di riferimento, questo è il modo in cui sto usando la statica per il mio formattatore di date per l'utilizzo in un controller di visualizzazione tabella.

+ (NSDateFormatter *) relativeDateFormatter 
{ 
    static NSDateFormatter *dateFormatter; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     //NSLog(@"Created"); 
     dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; 
     [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
     NSLocale *locale = [NSLocale currentLocale]; 
     [dateFormatter setLocale:locale]; 
     [dateFormatter setDoesRelativeDateFormatting:YES]; 
    }); 
    return dateFormatter; 
} 
Problemi correlati