objective c - smart - ¿Las entradas siempre se inicializan en 0?
solidity español (3)
¿Es seguro contar con int
s siempre inicializado a 0 en Objective-C?
Más específicamente, cuando un objeto con int
ivars ha sido recientemente instanciado, ¿es seguro asumir que sus ivars tienen valor 0?
No creo que deba suponer ningún valor para la inicialización. Si está construyendo lógica alrededor de un valor "0", debe configurarlo para estar seguro.
Sí, en C los valores globales se inicializan a cero. En Objective-C, incluso los vars locales se inicializan a cero. Usted puede contar con él.
Sí, las variables de instancia de clase siempre se inicializan a 0 (o nil
, NULL
o false
, según el tipo de datos exacto). Ver el lenguaje de programación Objective-C 2.0 :
El método
alloc
asigna dinámicamente la memoria para las variables de instancia del nuevo objeto y las inicializa a 0, es decir, a excepción de la variableisa
que conecta la nueva instancia a su clase.
EDITAR 2013-05-08
Apple parece haber eliminado el documento anterior (ahora vinculado a The Wayback Machine). El documento activo (actualmente) Programming With Objective-C contiene una cita similar:
El método
alloc
tiene otra tarea importante, que es borrar la memoria asignada para las propiedades del objeto al establecerlos en cero. Esto evita el problema habitual de la memoria que contiene basura de lo que fuera almacenado anteriormente, pero no es suficiente para inicializar un objeto por completo.
Sin embargo, esto solo es cierto para las variables de una clase; también es cierto para los tipos de POD declarados a nivel mundial:
// At global scope
int a_global_var; // guaranteed to be 0
NSString *a_global_string; // guaranteed to be nil
Con una excepción, no es cierto para las variables locales, o para los datos asignados con malloc()
o realloc()
; es cierto para calloc()
, ya que calloc()
explícitamente cierra la memoria que asigna.
La única excepción es que cuando el conteo automático de referencias (ARC) está habilitado, los punteros de pila a los objetos de Objective-C se inicializan implícitamente a nil
; sin embargo, sigue siendo una buena práctica inicializarlos explícitamente a nil
. Desde la transición a las notas de la versión de ARC :
Las variables de pila se inicializan con
nil
Utilizando ARC, las variables de pila fuertes, débiles y autorrellentes ahora se inicializan implícitamente con
nil
En objetos C ++ (y C ++ que se usan en Objective-C ++), las variables de instancia de clase tampoco se inicializan a cero. Debe inicializarlos explícitamente en su (s) constructor (es).