zmienne statyczne w Objective-C-co robią?

Widziałem kilka postów omawiających czym jest zmienna statyczna i myślę, że ją rozumiem - ale chciałbym szybko napisać (lub znaleźć) program, który wykorzystuje zarówno zwykłą, jak i statyczną zmienną, obok siebie i zobaczyć, jak / Kiedy działają inaczej. Jakiś szybki n dirty code, może Dwa vary int i kilka instrukcji śledzenia nslog tylko po to, aby zobaczyć, jak się różnią.

Ktoś ma jakieś wskazówki/pomysły / Kod, które obrazowałyby, jak statyczny var różni się od zwykły?

Author: Sirab33, 2011-02-11

3 answers

Zarówno w C, jak i Objective-C, zmienna statyczna jest zmienną przydzielaną na cały okres życia programu. Jest to w przeciwieństwie do zmiennych automatycznych , których żywotność istnieje podczas pojedynczego wywołania funkcji; i dynamicznie przydzielanych zmiennych, takich jak obiekty, które mogą być zwolnione z pamięci, gdy nie są już używane. Mówiąc prościej, wartość zmiennej statycznej jest utrzymywana przez wszystkie wywołania funkcji/metod. Gdy zadeklarowana 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 tej funkcji lub metodzie, ale wartość jest zachowana między wywołaniami.

Powiedz, że masz to:

int f(void)
{
    int i = 5;
    i += 10;
    return i;
}

Każde wywołanie f() zwróci wartość 15.

Teraz powiedz, że masz to:

int g(void)
{
    static int i = 5;
    i += 10;
    return i;
}

Przy pierwszym wywołaniu g() zostanie zwrócona wartość 15. Drugi raz zostanie zwrócony 25, ponieważ i zachowało swoją wartość 15, a następnie zwiększa się o 10. Trzecie wywołanie, 35 zostanie zwrócone. I tak dalej.

W kontekście klas Objective-C, zmienne statyczne są często używane do naśladowania zmiennych klas , ponieważ Objective-C nie ma zmiennych klas (inne języki, takie jak Java, do). Na przykład, powiedzmy, że chcesz leniwie zainicjować obiekt i tylko ten obiekt zwrócić. Możesz to zobaczyć:

static MyObject *obj = nil;

@implementation MyObject

+ (id)sharedObject
{
    if (obj == nil) obj = [[MyObject alloc] init];
    return obj;
}

@end

obj zostanie zainicjalizowana przy pierwszym wywołaniu classObject ; kolejne wywołania classObject zwrócą ten sam obiekt. Można to sprawdzić rejestrując adres obiektu:

NSLog(@"obj is at %p", [MyObject sharedObject]);
NSLog(@"obj is at %p", [MyObject sharedObject]);    // Will print the same address both times

Ponadto, {[13] } będzie widoczny dla wszystkich metod w MyObject.

Ta technika jest używana do implementacji klas singleton w Objective-C, jak również.

 130
Author: mipadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-10 16:05:15

Static działa głównie jak w C.

  1. Może zainicjować zmienną tylko raz.

  2. Deklarowanie zmiennej statycznej w powyższym bloku @implementationbędzie dostępne tylko dla całego pliku.

 2
Author: chunkyguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-11 02:47:03

"static" odnosi się bardziej do atrybutów zmiennej (who what where), a nie tylko do wartości. W przeciwieństwie do innych języków, w których odnosi się wyłącznie do wartości.

  • Sticky

To jak przypinanie var do określonej lokalizacji, czy to wewnątrz funkcji, czy w implementacji.

  • Private

Ma podobne atrybuty do" prywatnego " var, ponieważ nie jest widoczny dla rodzeństwa ani rodziców, ale dzieci mają do niego dostęp.

  • Classy

Jest to deklaracja z wartością domyślną. Podobnie jak w innych językach, w których definiujesz var w ramach klasy i przypisujesz im" domyślną " wartość:

private int myNumber = 3;

To daje nam zmienne "podobne do klasy" w funkcjach. Zadeklaruj je raz, wtedy gdy funkcja manipuluje wartością, wartość jest zachowywana. Następnym razem, gdy funkcja zostanie wywołana, wartość będzie taka sama jak po poprzednim "cyklu", tak jak można oczekiwać klasy wartość zmiennej pozostanie po manipulacji.

 1
Author: bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-11 17:22:23