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

Est-il sûr de compter sur int s toujours initialisé à 0 dans Objective-C?

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

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.0 :

La méthode alloc alloue dynamicment la mémoire pour les variables d’instance du nouvel object et les initialise toutes à 0, à 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 (maintenant 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 consiste à effacer la mémoire allouée pour les propriétés de l’object en les mettant à zéro. Cela évite le problème habituel de la mémoire contenant des déchets de ce qui était stocké auparavant, mais ne suffit pas pour initialiser complètement un object.


Cependant, ceci n’est vrai que pour les variables d’instance d’une classe; Cela est également vrai pour les types de POD déclarés au niveau mondial:

 // At global scope int a_global_var; // guaranteed to be 0 NSSsortingng *a_global_ssortingng; // guaranteed to be nil 

A une exception près, ce n’est pas le cas pour les variables locales ou pour les données allouées avec malloc() ou realloc() ; c’est vrai pour calloc() , puisque calloc() explicitement à calloc() la mémoire allouée.

La seule exception est que lorsque le comptage automatique des références est activé, les pointeurs de stack vers les objects Objective-C sont implicitement initialisés à nil ; cependant, il est toujours recommandé de les initialiser explicitement à nil . De la transition vers les notes de version ARC :

Les variables de stack sont initialisées avec nil

En utilisant ARC, les variables de stack fort, faible et autoreleasing sont désormais implicitement initialisées avec nil

En C ++ (et les objects C ++ utilisés dans Objective-C ++), les variables d’instance de classe ne sont pas non plus initialisées à zéro. Vous devez les initialiser explicitement dans votre ou vos constructeurs.

Je ne pense pas que vous devriez assumer des valeurs pour l’initialisation. Si vous construisez une logique autour d’une valeur “0”, vous devez la définir pour être sûr.

Oui, en C les vars globaux sont initialisés à zéro. Dans Objective-C, même les vars locaux sont initialisés à zéro. Tu peux compter dessus.