web-dev-qa-db-fra.com

Les entiers sont-ils toujours initialisés à 0?

Est-il sûr de compter que ints est toujours initialisé à 0 dans Objective-C?

Plus précisément, lorsqu'un objet avec int ivars a été nouvellement instancié, est-il sûr de supposer que ses ivars ont la valeur 0?

73
Felixyz

Oui, les variables d'instance de classe sont toujours initialisées à 0 (ou nil, NULL ou false, selon le type de données exact). Voir le langage de programmation Objective-C 2. :

La méthode alloc alloue dynamiquement de la mémoire pour les variables d'instance du nouvel objet et les initialise toutes à 0, c'est-à-dire à l'exception de la variable isa qui connecte la nouvelle instance à sa classe.


EDIT 2013-05-08
Apple semble avoir supprimé le document ci-dessus (désormais lié à The Wayback Machine). Le document (actuellement) actif Programmation avec Objective-C contient une citation similaire:

La méthode alloc a une autre tâche importante, qui est d’effacer la mémoire allouée aux propriétés de l’objet en les mettant à zéro. Cela évite le problème habituel de la mémoire contenant des déchets de tout ce qui a été stocké auparavant, mais n'est pas suffisant pour initialiser complètement un objet.


Cependant, c'est seulement true pour les variables d'instance d'une classe; c'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, c'est pas true pour les variables locales ou pour les données allouées avec malloc() ou realloc(); c'est vrai pour calloc(), puisque calloc() met à zéro explicitement la mémoire qu'il alloue.

La seule exception est que lorsque le comptage de référence automatique (ARC) est activé, les pointeurs de pile vers les objets Objective-C sont implicitement initialisés à nil; cependant, il est toujours recommandé de les initialiser explicitement sur nil. Du Transition vers les notes de version ARC :

Les variables de pile sont initialisées avec nil

En utilisant ARC, les variables de pile fortes, faibles et à libération automatique sont maintenant implicitement initialisées avec nil

En C++ (et les objets C++ utilisés dans Objective-C++), les variables d'instance de classe sont également pas initialisées à zéro. Vous devez les initialiser explicitement dans vos constructeurs.

112
Adam Rosenfield