2009-06-13 21 views
72

¿Es seguro contar con int siempre siendo inicializado a 0 en Objective-C?¿Las entradas siempre se inicializan en 0?

Más específicamente, cuando un objeto con int ivars ha sido recientemente instanciado, ¿es seguro asumir que sus ivars tienen valor 0?

Respuesta

110

Sí, las variables de instancia de clase siempre se inicializan en 0 (o nil, NULL o false, según el tipo de datos exacto). Ver la Objective-C 2.0 Programming Language:

El método alloc asigna dinámicamente la memoria para las variables de instancia del objeto nuevo y se los inicializa a 0-todo, es decir, excepto la variable isa que conecta la nueva instancia de su clase.


EDITAR 2013-05-08
de Apple parece haber eliminado el documento anterior (ahora vinculado a la Wayback Machine). El (actualmente) documento activo Programming With Objective-C contiene una citación similar:

El método alloc tiene otra tarea importante, que es para limpiar la memoria asignada para las propiedades del objeto estableciendo su valor a 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 es solamente cierto para las variables de instancia de una clase; también es cierto para los tipos de POD declarados en el ámbito global:

// 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 verdadero para calloc(), ya que calloc() cerra explícitamente 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 en nil. De los Transitioning to to ARC Release Notes:

variables de pila se inicializan con nil

Usando ARC, fuerte, débil, y autoreleasing variables de pila ahora están implícitamente inicializados con nil

En C++ los objetos (y C++ siendo utilizado en Objective-C++), las variables de instancia de clase también son no con cero inicialización. Debe inicializarlos explícitamente en su (s) constructor (es).

+3

Spot on. Sin embargo, el hecho de que las personas a menudo se preguntan sobre este detalle puede ser una razón suficiente para ser más explícitos sobre la inicialización de las variables, posiblemente la opción "más segura". Inicializar a 0/nil/NULL nunca lastimó a nadie ... :-) –

+0

Estoy de acuerdo con Quinn. En este caso, sin embargo, estoy creando una clase "abstracta" que no implementa - (void) init, y no quiero obligar a todas las subclases a recordar para inicializar las ivars. Así que es bueno saber que puedo contar con que se inicializaron a 0. – Felixyz

+0

Mi experiencia, incluso en el modo de lanzamiento para iOS, es que incluso las variables locales se inicializan en 0 – jjxtra

-1

No creo que deba asumir ningún valor para la inicialización. Si está construyendo lógica alrededor de un valor "0", debe configurarlo para estar seguro.

+0

Supongo que podemos ver esto como una respuesta válida para C++, mientras que la respuesta de Adam se aplica a Objective-C? – Felixyz

+11

La respuesta de Adam para Objective C es exactamente correcta: Objective C garantiza absolutamente que los ivars están configurados en nil/NULL/false/0 en la asignación y es perfectamente razonable aceptar y usar este hecho. Por ejemplo, esto permite la inicialización trivial perezosa de NSMultableArray * ivars con [NSMultableArray array o nuevo] cuando se notan como nulos. Combinado con Objective C que garantiza que [[NSMultableArray *)] devuelve 0, a menudo puede retrasar la inicialización aún más. Aprende a amar de la manera en que Objective C lo hace, no solo a luchar contra sus diferencias. –

-2

Sí, en C los valores globales se inicializan a cero. En Objective-C incluso los vars locales se inicializan a cero. Puede contar con eso.

+1

@ La respuesta de AdamRosenfield contradice directamente su afirmación de que incluso los vars locales se inicializan a cero. ¿Quién está equivocado? –

Cuestiones relacionadas