Os ints são sempre inicializados em 0?

É seguro contar com int sempre sendo inicializado em 0 no Objective-C?

Mais especificamente, quando um object com int ivars foi recentemente instanciado, é seguro assumir que seus ivars têm valor 0?

Sim, as variables ​​de instância de class são sempre inicializadas como 0 (ou nil , NULL ou false , dependendo do tipo de dados exato). Veja a linguagem de programação Objective-C 2.0 :

O método de alocação dinamicamente aloca memory para as variables ​​de instância do novo object e inicializa todas elas para 0 – tudo, isto é, exceto a variável isa que conecta a nova instância à sua class.


EDIT 2013-05-08
A Apple parece ter removido o documento acima (agora vinculado à The Wayback Machine). O documento (atualmente) ativo Programming With Objective-C contém uma citação semelhante:

O método alloc tem uma outra tarefa importante, que é limpar a memory alocada para as propriedades do object, definindo-as como zero. Isso evita o problema usual de memory contendo lixo do que foi armazenado antes, mas não é suficiente para inicializar um object completamente.


No entanto, isso é verdade apenas para variables ​​de instância de uma class; também é verdade para os tipos de POD declarados no escopo global:

 // At global scope int a_global_var; // guaranteed to be 0 NSString *a_global_string; // guaranteed to be nil 

Com uma exceção, isso não é verdadeiro para variables ​​locais ou para dados alocados com malloc() ou realloc() ; Isso é verdade para calloc() , pois calloc() explicitamente zera a memory que aloca.

A única exceção é que quando o Automatic Reference Counting (ARC) está habilitado, pointers de pilha para objects Objective-C são implicitamente inicializados para nil ; no entanto, ainda é uma boa prática inicializá-los explicitamente para nil . Das Notas de Lançamento da Transição para a ARC :

Variáveis ​​de pilha são inicializadas com nil

Usando ARC, as variables ​​de pilha fortes, fracas e autoreleasing são agora implicitamente inicializadas com nil

Em C ++ (e objects C ++ sendo usados ​​em Objective-C ++), as variables ​​de instância de class também não são inicializadas com zero. Você deve inicializá-los explicitamente em seu (s) construtor (es).

Eu não acho que você deve assumir quaisquer valores para boot. Se você está criando lógica em torno de um valor “0”, você deve configurá-lo para ter certeza.

Sim, em C global vars são inicializados para zero. Em Objective-C, mesmo vars locais são inicializados para zero. Você pode contar com isso.