Oui, les variables d'instance de classe sont toujours initialisées à 0 (ou nil
, NULL
ou false
, en fonction du type de données exact). Voir la Objective-C 2.0 Programming Language:
La méthode alloc
alloue dynamiquement la mémoire pour la nouvelle variables d'instance de l'objet et les initialise tous à 0-tout, qui est, à l'exception de la variable isa
qui relie la nouvelle instance à sa classe.
EDIT 2013-05-08
Apple semble avoir retiré le document ci-dessus (maintenant lié à la Wayback Machine). Le (actuellement) document actif Programming With Objective-C contient une citation similaire:
La méthode alloc
a une autre tâche importante qui consiste à effacer la mémoire allouée pour les propriétés de l'objet en les mettant à zéro. Cela évite le problème habituel de mémoire contenant des déchets de tout ce qui était stocké auparavant, mais ne suffit pas à initialiser complètement un objet.
Cependant, cela est seulement vrai pour les variables d'instance d'une classe; il est également vrai pour les types de POD déclarés à portée globale:
// At global scope
int a_global_var; // guaranteed to be 0
NSString *a_global_string; // guaranteed to be nil
À une exception près, il est vrai pas pour les variables locales ou pour les données affectées avec malloc()
ou realloc()
; il est vrai pour calloc()
, puisque calloc()
explicitement zéros la mémoire qu'il alloue. La seule exception est que lorsque le comptage automatique de références (ARC) est activé, les pointeurs de pile vers les objets Objective-C sont implicitement initialisés à nil
; Cependant, il est toujours bon de les initialiser explicitement à nil
. Des Transitioning to to ARC Release Notes:
Variables de la pile sont initialisés avec nil
utilisant ARC, fort, faible, et autoreleasing variables de pile sont désormais implicitement initialisées avec nil
en C++ objets (et C++ étant utilisé dans Objective-C++), les variables d'instance de classe sont également et non initialisées par zéro. Vous devez les initialiser explicitement dans votre (vos) constructeur (s).
Spot sur. Cependant, le fait que les gens s'interrogent souvent sur ce détail peut être une raison suffisante pour être plus explicite sur l'initialisation des variables, sans doute le choix le plus «sûr». L'initialisation à 0/nul/NULL ne blesse personne ... :-) –
Je suis d'accord avec Quinn. Dans ce cas, cependant, je crée une classe "abstraite" qui n'implémente pas - (void) init, et je ne veux pas forcer chaque sous-classe à se souvenir d'initialiser les ivars. C'est donc bon de savoir que je peux compter sur leur initialisation à 0. – Felixyz
Mon expérience même en mode release pour iOS est que même les variables locales sont initialisées à 0 – jjxtra