Ist es sicher, dass int
s in Objective-C immer auf 0 initialisiert wird?
Wenn ein Objekt mit int
Ivars neu instanziiert wurde, kann man dann sicher annehmen, dass seine Ivars den Wert 0 haben?
Antworten:
Ja, Klasse Instanzvariablen werden immer auf 0 initialisiert (oder nil
, NULL
oder false
, abhängig von dem genauen Datentyp). Siehe die Programmiersprache Objective-C 2.0 :
Die
alloc
Methode reserviert dynamisch Speicher für die Instanzvariablen des neuen Objekts und initialisiert sie alle mit 0, dh mit Ausnahme derisa
Variablen, die die neue Instanz mit ihrer Klasse verbindet.
EDIT 2013-05-08
Apple scheint das obige Dokument entfernt zu haben (jetzt mit The Wayback Machine verknüpft). Das (derzeit) aktive Dokument Programmieren mit Objective-C enthält ein ähnliches Zitat:
Die
alloc
Methode hat eine weitere wichtige Aufgabe: Sie löscht den für die Objekteigenschaften zugewiesenen Speicher, indem Sie sie auf Null setzen. Dies vermeidet das übliche Problem, dass Speicher Speicher von allem enthält, was zuvor gespeichert wurde, reicht jedoch nicht aus, um ein Objekt vollständig zu initialisieren.
Dies gilt jedoch nur für beispielsweise Variablen einer Klasse. Dies gilt auch für POD-Typen, die im globalen Bereich deklariert wurden:
// 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 zugeordnet sind realloc()
. Dies gilt für calloc()
, da calloc()
der zugewiesene Speicher explizit auf Null gesetzt wird.
Die einzige Ausnahme besteht darin, dass bei aktivierter automatischer Referenzzählung (ARC) Stapelzeiger auf Objective-C-Objekte implizit initialisiert werden nil
. Es ist jedoch immer noch eine gute Praxis, sie explizit zu initialisieren nil
. Vom Übergang zu ARC Versionshinweise :
Stapelvariablen werden mit initialisiert
nil
Mit ARC werden nun implizit starke, schwache und automatisch freigegebene Stapelvariablen mit initialisiert
nil
In C ++ (und C ++ - Objekten, die in Objective-C ++ verwendet werden) werden Klasseninstanzvariablen ebenfalls nicht mit Null initialisiert. Sie müssen sie explizit in Ihren Konstruktoren initialisieren.
id
ebenfalls auf Null initialisiert.
int
, NSUInteger
, CGFloat
, float
, bool
, BOOL
, char
, etc.) sind alle auf 0 in diesen Typen dargestellt initialisiert.
Ich denke nicht, dass Sie Werte für die Initialisierung annehmen sollten. Wenn Sie eine Logik um einen "0" -Wert erstellen, sollten Sie ihn sicherheitshalber einstellen.
Ja, in C werden globale Variablen auf Null initialisiert. In Objective-C werden sogar lokale Variablen auf Null initialisiert. Du kannst dich darauf verlassen.