2009-06-13 6 views
72

Est-il sûr de compter sur int en étant toujours initialisé à 0 en Objective-C?Les ints sont-ils toujours initialisés à 0?

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

Répondre

110

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).

+3

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 ... :-) –

+0

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

+0

Mon expérience même en mode release pour iOS est que même les variables locales sont initialisées à 0 – jjxtra

-1

Je ne pense pas que vous devriez supposer des valeurs pour l'initialisation. Si vous construisez la logique autour d'une valeur "0", vous devez le définir pour être sûr.

+0

Je suppose que nous pouvons voir cela comme une réponse valide pour C++, alors que la réponse d'Adam s'applique à Objective-C? – Felixyz

+11

La réponse d'Adam à l'objectif C est tout à fait juste - l'objectif C garantit absolument que les ivars sont mis à zéro/NULL/false/0 lors de l'allocation et il est parfaitement logique d'accepter et d'utiliser ce fait. Par exemple, cela permet une initialisation paresseuse triviale de NSMultableArray * ivars avec [NSMultableArray array ou new] lorsqu'ils sont considérés comme nuls. Combiné avec Objective C guarentteing [(NSMultableArray *) count] renvoie 0, vous pouvez souvent reporter l'initialisation encore plus loin. Apprenez à aimer la façon dont l'objectif C le fait, et pas seulement lutter contre ses différences. –

-2

Oui, dans C les variables globales sont initialisées à zéro. En Objective-C même les variables locales sont initialisées à zéro. Vous pouvez compter dessus.

+1

@ réponse AdamRosenfield contredit directement votre affirmation que même les variables locales sont initialisées à zéro. Qui a tort? –

Questions connexes