Werden Ints immer auf 0 initialisiert?

Ist es sicher zu zählen, dass int in Objective-C immer auf 0 initialisiert wird?

Genauer gesagt, wenn ein Objekt mit int Ivars neu instanziiert wurde, ist es sicher anzunehmen, dass seine Ivars den Wert 0 haben?

Ja, classninstanzvariablen werden immer auf 0 initialisiert (oder nil , NULL oder false , abhängig vom genauen Datentyp). Siehe die Objective-C 2.0 Programmiersprache :

Die alloc Methode alloc dynamisch Speicher für die alloc des neuen Objekts zu und initialisiert sie alle auf 0-all, das heißt mit Ausnahme der isa Variablen, die die neue Instanz mit ihrer class verbindet.


BEARBEITEN 2013-05-08
Apple scheint das obige Dokument (jetzt verbunden mit The Wayback Machine) entfernt zu haben. Das (aktuell) aktive Programm Programming With Objective-C enthält ein ähnliches Zitat:

Die alloc Methode hat noch eine weitere wichtige Aufgabe: Sie alloc den Speicher, der den Eigenschaften des Objekts zugeordnet ist, indem er sie auf Null setzt. Dies vermeidet das übliche Problem von Speicher, der Müll von dem, was zuvor gespeichert wurde, enthält, reicht jedoch nicht aus, um ein Objekt vollständig zu initialisieren.


Dies gilt jedoch nur für Variablen einer class. Dies gilt auch für POD-Typen, die global deklariert werden:

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

Mit einer Ausnahme gilt dies nicht für lokale Variablen oder für Daten, die mit malloc() oder realloc() zugewiesen wurden. calloc() gilt für calloc() , da calloc() den zugewiesenen Speicher explizit auf calloc() .

Die einzige Ausnahme besteht darin, dass bei der automatischen Referenzzählung (ARC) Stapelzeiger auf Objective-C-Objekte implizit auf nil initialisiert werden. Es ist jedoch immer noch eine gute Methode, sie explizit auf nil zu initialisieren. Vom Übergang zum ARC Release Notes :

Stapelvariablen werden mit nil initialisiert

Unter Verwendung von ARC werden nun starke, schwache und automatisch freisetzende Stapelvariablen implizit mit nil initialisiert

In C ++ (und C ++ – Objekten, die in Objective-C ++ verwendet werden) sind classninstanzvariablen ebenfalls nicht null-initialisiert. Sie müssen sie explizit in Ihren Konstruktoren initialisieren.

Ich denke nicht, dass Sie irgendwelche Werte für die Initialisierung annehmen sollten. Wenn Sie eine Logik um einen “0” -Wert herum aufbauen, sollten Sie es als sicher festlegen.

Ja, in C werden globale Variablen auf Null initialisiert. In Objective-C werden sogar lokale vars auf Null initialisiert. Du kannst dich darauf verlassen.