2009-04-17 6 views
1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    // Date formatter for displaying dates 
    static NSDateFormatter *dateFormatter = nil; 
    if(dateFormatter == nil){ 
     dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; 
     [dateFormatter setDateFormat:NSDateFormatterMediumStyle]; 
    } 

Warum initialisieren wir die Variable dateFormatter und testen dann sofort, ob sie null ist? Das habe ich im neueren Apple Code sehr gemerkt. Neugierig!Apple Code: Objekt initialisieren als null, dann

-Buffalo

Antwort

5

Das liegt daran, dass die Variable eine lokale statische Variable ist, was bedeutet, dass sie ihren Wert behält, auch wenn die lokale Funktion zurückkehrt oder den Gültigkeitsbereich verlässt. Wenn die Funktion zum ersten Mal ausgeführt wird, wird die Variable auf Null gesetzt. Dann prüfen Sie auf Null und initialisieren die Variable (dies geschieht nur einmal). Jedes Mal, wenn die Funktion ausgeführt wird, hat die Variable einen Nicht-Null-Wert, sodass der Initialisierungscodeblock nicht ausgeführt wird.

+0

Ah, ok. Dies ist ähnlich dem Singleton-Entwurfsmuster. Neato;) – Buffalo

+0

Es ist eigentlich ein bisschen anders. Es wird häufig in C verwendet, wo Funktionen eine Art von Zustandsdaten enthalten müssen, aber wo es für nichts Sinn macht, außer für die Funktion zu wissen oder sich darum zu kümmern, was diese Daten sind. –

2

Wahrscheinlich becuase es eine statische Variable ist. Mit anderen Worten, der Wert sollte sich nach dem Beenden der Methode nicht ändern. Höchstwahrscheinlich liegt das daran, dass Sie nur eine Instanz der Variablen wünschen, die bei jedem Methodenaufruf bestehen bleibt.

1

Die Variable ist eine lokale statische Variable. Der Wert wird zwischen Methodenaufrufen beibehalten. Daher wird sie beim ersten Aufruf auf null initialisiert und dann wird ihr Wert der Adresse einer Instanz von NSDateFormatter* zugewiesen. Bei nachfolgenden Aufrufen ist der Wert ungleich Null (da er der Adresse der NSDateFormatter-Instanz zugewiesen wurde) und wird daher nicht erneut initialisiert.

Eine lokale statische Variable ist wie eine globale Variablen mit Namensbereich. Sein Wert ist global für den Prozess, aber es ist sichtbar nur innerhalb des Bereichs, in dem es deklariert wurde.

Verwandte Themen