2009-07-06 13 views
66

Nie bardzo rozumiem zmienne statyczne, gdy są zdefiniowane w implementacji interfejsu. W metodach rozumiem, jak różnią się one od zmiennych lokalnych, ale nie, gdy są zdefiniowane bezpośrednio w implementacji.Jakie znaczenie mają zmienne statyczne w implementacji interfejsu?

Spójrz na te przykłady. Jaką różnicę robią te dwie rzeczy?

#include "MyClass.h" 

@implementation MyClass 
int myInt; 
... 
@end 

I:

#include "MyClass.h" 

@implementation MyClass 
static int myInt; 
... 
@end 

myInt jest w obu przypadkach widoczne dla wszystkich metod, a jeśli ja interpretować test został uruchomiony poprawnie, myInt będzie w obu przypadkach taka sama zmienna dla różnych wystąpień klasa.

+0

Zobacz http://stackoverflow.com/a/4965145/654870 –

Odpowiedz

68

Słowo kluczowe "statyczne" w tym kontekście jest takie samo, jak w zwykłym C: ogranicza zakres myInt do bieżącego pliku.

+12

Ponadto, definiując zmienną lokalną wewnątrz [email protected] nie różni się od zdefiniowania to na zewnątrz. – sigjuice

+0

Ale czy to naprawdę ma znaczenie dla definicji w plikach implementacyjnych?Nie są one zawarte w każdym razie. – quano

+8

Załóżmy, że zadeklarowałeś int Varibale; w dwóch różnych plikach implementacyjnych. Otrzymasz błędy w czasie kompilacji z powodu powtarzających się symboli. –

16

Z "języka programowania Objective C" firmy Apple: "Deklarowanie zmiennej ogranicza jej zakres do samej klasy - i tylko do części klasy zaimplementowanej w pliku. (W ten sposób w odróżnieniu od zmiennych instancji zmienne statyczne nie mogą być dziedziczone przez podklasy lub bezpośrednio nimi manipulowane). "

80

Niestety, ma różne skutki w zależności od tego, gdzie go używasz.

Funkcje statyczne:
Domyślnie wszystkie funkcje mają zasięg globalny. Specyfikator statyczny pozwala ograniczyć zakres funkcji do bieżącego pliku.

statyczne Zmienne lokalne:
Po użyciu statycznej modyfikator o zmiennej lokalnej, funkcja „pamięta” wartość całej inwokacji. Na przykład zmienna currentCount w poniższym fragmencie nigdy nie zostanie zresetowana, więc zamiast zapisywać licznik w zmiennej wewnątrz main(), możemy pozwolić countByTwo() nagrać dla nas.

// main.m 
#import <Foundation/Foundation.h> 

int countByTwo() { 
    static int currentCount = 0; 
    currentCount += 2; 
    return currentCount; 
} 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     NSLog(@"%d", countByTwo()); // 2 
     NSLog(@"%d", countByTwo()); // 4 
     NSLog(@"%d", countByTwo()); // 6 
    } 
    return 0; 
} 

Takie użycie słowa kluczowego static nie wpływa na zakres zmiennych lokalnych.
Przeczytaj więcej na temat static keyword.

+6

Statyczne słowo kluczowe spowoduje, że jego wiersz będzie wykonywany WYŁĄCZNIE raz dla całego środowiska wykonawczego aplikacji - niezależnie od liczby wywołań! – Honey

+0

Gdzie w pamięci jest przechowywana zmienna statyczna "currentCount"? Nie może być w ramce countByTwo, ponieważ ta klatka jest deallocated, gdy funkcja się kończy. Więc gdzie jest przechowywany? – Enrique

16

"W C i Objective-C zmienna statyczna jest zmienną, która jest alokowana dla całego okresu istnienia programu, w odróżnieniu od zmiennych automatycznych, których żywotność istnieje podczas pojedynczego wywołania funkcji i dynamicznie alokowane zmienne, takie jak obiekty, które mogą być zwolnione z pamięci, gdy nie są już używane, a mówiąc prościej, wartość zmiennej statycznej jest utrzymywana przez wszystkie wywołania funkcji/metody. Gdy deklarowana jest poza funkcją, zmienna statyczna jest widoczna dla wszystkiego w pliku w którym jest zadeklarowana, gdy jest zadeklarowana wewnątrz funkcji lub metody, jest widoczna tylko w ramach tej funkcji lub metody, ale wartość jest zachowywana między wywołaniami. "

Sprawdź pełnego wyjaśnienia tu:

https://stackoverflow.com/a/4965145/951349