Objetivo C - están SystemSoundID de (typedef'd UInt32) asignado automáticamente 0?
-
19-09-2019 - |
Pregunta
- (void)playAlarmSound:(NSTimer *)theTimer {
static SystemSoundID soundID/* = 0 */; // ?
if (!soundID) {
soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];
}
...
}
Es SystemSoundID (que es un UInt32) asigna automáticamente 0? o debería asignar explícitamente? Tengo que hacerlo de esta manera y la prueba para ver si no se ha inicializado por el método de utilidades, ya que no se compila si acabo de hacer static SystemSoundID soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];
. Al principio traté de asignarlo a NULL, pero luego me di cuenta que no es un puntero, por lo que de todos modos, debería tener la = 0
allí o es redundante?
Solución
Esta pregunta no implica ningún características Objective-C, por lo que la respuesta se encuentra en el estándar c.
C99, sección §6.7.8, párrafo 10:
Si un objeto que tiene la duración de almacenamiento estático no es inicializado explícitamente, entonces:
...
- si tiene tipo aritmético, es inicializado a (positivo o sin signo) cero;
UInt32 (que en sí es sólo uint32_t) es un tipo aritmético. Por lo tanto, inicializado a cero.
Otros consejos
Esto no tiene nada que ver con el tipo - que tiene que ver con la clase de almacenamiento. En C, las variables estáticas y globales se inicializan automáticamente a 0. variables locales ordinarios (auto) no se inicializa automáticamente, por lo que tiene que hacer usted mismo o que van a contener basura.
Creo objetivo-c sigue las mismas reglas como C para esto.
variables estáticas y globales se inicializan a 0 (es decir, mientras auto) variables locales no se inicializan y pueden comenzar con un valor impredecible.
Dicho esto, no se pierde nada para inicializar explícitamente el valor a 0.