2009-02-16 7 views
42

Patrzę na poniższym kodzie źródłowym przykład Apple:Używając słowa kluczowego static w Objective-C podczas definiowania buforowanych zmiennej

/* 
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"]; 
} 

próbuje dowiedzieć się:

  • Dlaczego użyć statycznej słowo kluczowe?

  • W jaki sposób jest to związane ze zmienną w pamięci podręcznej, jeśli ustawiono wartość zerową za każdym razem, gdy wywoływana jest metoda.

Kod pochodzi z przykładu 4 w Tableview Suite demo

Odpowiedz

62

Zmienne statyczne zachowują przypisane wartości poprzez wielokrotne wywołania funkcji. Są w zasadzie jak wartości globalne, które są tylko "widoczne" dla tej funkcji.

Instrukcja inicjalizatora jest wykonywana tylko raz.

Ten kod inicjuje dateFormatter, aby zerować za pierwszym użyciem funkcji. Przy każdym kolejnym wywołaniu funkcji sprawdza się wartość dateFormatter. Jeśli nie jest ustawione (co będzie prawdą tylko za pierwszym razem) zostanie utworzona nowa właściwość dateFormatter. Jeśli jest ustawiony, zamiast niego zostanie użyta statyczna zmienna dateFormatter.

Warto poznać zmienne statyczne. Mogą być bardzo wygodne, ale mają również wady (w tym przykładzie niemożliwe jest na przykład zwolnienie obiektu dateFormatter).

Wskazówka: czasami może być pouczające umieszczenie punktu przerwania w kodzie i sprawdzenie, co się dzieje. Wraz ze wzrostem złożoności twoich programów będzie to nieoceniona umiejętność.

+1

Witam @Andrew Grant, bardzo ładne wyjaśnienie, W tym przypadku, jak już wspomniałeś, niemożliwe jest zwolnienie go, załóżmy, że chcę go zwolnić i przypisać nową wartość do formatera daty, a następnie jak to zrobić. – Ranjit

16

static” funkcjonalnie oznacza „nie oceniać rzeczy po prawej stronie znaku równości każdym razem przez, wykorzystać swoją poprzednią wartość zamiast” THE w tym przypadku.

Używaj tej wielkiej mocy z wielką odpowiedzialnością: ryzykujesz używanie całej tony pamięci, ponieważ są to obiekty, które nigdy nie znikają. Jest rzadko odpowiedni, z wyjątkiem przypadków takich jak ten z NSDateFormatter.

+10

Wiem, że to STARE pytanie, ale zastanawiasz się, jaki wpływ ma to statyczne słowo kluczowe na ARC? – codejunkie

+3

Statyki @codejunkie są przechowywane w innym miejscu niż sterty. ARC dotyczy przechowywania i zwalniania pamięci sterty, dzięki czemu wartości mogą utrzymywać się poza ramkami stosów. Dlatego wątpię, aby ARC miało jakikolwiek wpływ na zmienne statyczne. – smileBot

1

W celach informacyjnych w ten sposób używam statycznego dla mojego formatyzatora daty do użycia w sterowniku widoku tabeli.

+ (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; 
} 
Powiązane problemy