Czy ints jest zawsze inicjowany na 0?

Czy można bezpiecznie liczyć na to, że intS są zawsze inicjalizowane na 0 w Objective-C?

Dokładniej, gdy obiekt z int ivars został nowo utworzony, czy można bezpiecznie założyć, że jego ivars ma wartość 0?

Author: Josh Caswell, 2009-06-13

3 answers

Tak, zmienne instancji klasy są zawsze inicjalizowane na 0 (LUB nil, NULL, lub false, w zależności od dokładnego typu danych). Zobacz Objective - C 2.0 język programowania :

Metoda alloc dynamicznie przydziela pamięć dla zmiennych instancji nowego obiektu i inicjalizuje je wszystkie do 0-all, czyli z wyjątkiem zmiennej isa, która łączy nową instancję z jej klasą.


Edycja 2013-05-08
Apple wydaje się mieć usunięto powyższy dokument (teraz połączony z Wayback Machine). Obecnie aktywny dokument Programowanie z Objective-C zawiera podobny cytat:

Metoda alloc ma jeszcze jedno ważne zadanie, którym jest wyczyszczenie pamięci przeznaczonej dla właściwości obiektu poprzez ustawienie ich na zero. Pozwala to uniknąć zwykłego problemu pamięci zawierającej śmieci z tego, co zostało wcześniej zapisane, ale nie wystarczy, aby zainicjować obiekt całkowicie.


Jest to jednak tylko prawda na przykład dla zmiennych klasy; jest to również prawda dla typów pod zadeklarowanych w globalnym zasięgu:

// At global scope
int a_global_var;  // guaranteed to be 0
NSString *a_global_string;  // guaranteed to be nil

Z jednym wyjątkiem, jest to Nie prawda dla zmiennych lokalnych lub dla danych przydzielonych z malloc() lub realloc(); jest to prawda dla calloc(), ponieważ calloc() jawnie zeruje przydzieloną pamięć.

Jedynym wyjątkiem jest to, że gdy włączone jest automatyczne liczenie referencji (ARC), wskaźniki stosu do Obiekty Objective-C są domyślnie inicjalizowane na nil; jednak nadal dobrą praktyką jest jawne inicjowanie ich na nil. Z przejście do notatek Wydania ARC :

Zmienne stosu są inicjalizowane przez nil

Używanie zmiennych stosu ARC, strong, weak i autoreleasing jest teraz domyślnie inicjowane przez nil

W C++ (i obiektach C++ używanych w Objective-C++) zmienne instancji klasy są również , a nie zero-inicjowane. Musisz je jawnie zainicjować w swoim konstruktorze (- ach).
 110
Author: Adam Rosenfield,
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-10-28 02:50:16

Myślę, że nie powinieneś przyjmować żadnych wartości dla inicjalizacji. Jeśli budujesz logikę wokół wartości "0", powinieneś ustawić ją tak, aby była pewna.

 -1
Author: Cody C,
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
2009-06-13 15:01:11

Tak, W C zmienne globalne są inicjalizowane na zero. W Objective-C nawet lokalne var są inicjalizowane na zero. Możesz na to liczyć.

 -2
Author: Tom01,
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-05-23 15:58:21