Objective C - Are SystemSoundID di (typedef UInt32) assegnato automaticamente 0?
-
19-09-2019 - |
Domanda
- (void)playAlarmSound:(NSTimer *)theTimer {
static SystemSoundID soundID/* = 0 */; // ?
if (!soundID) {
soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];
}
...
}
È SystemSoundID (che è un UInt32) assegnato automaticamente 0? o dovrei esplicitamente assegnarlo? Devo farlo in questo modo e di prova per vedere se non è stato inizializzato con il metodo di utilità perché non si compila se faccio e basta static SystemSoundID soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];
. All'inizio ho cercato di assegnare a NULL, ma poi mi sono reso conto suo non è un puntatore, quindi, comunque, dovrei avere il = 0
in là o è ridondante?
Soluzione
Questa domanda non comporta tutte le funzioni Objective-C, in modo che la risposta si trova nello standard c.
C99, sezione §6.7.8, comma 10:
Se un oggetto che ha durata di conservazione statico non è inizializzato esplicitamente, allora:
...
- se ha tipo aritmetico, è inizializzato (positivo o senza segno) zero;
UInt32 (che di per sé è solo uint32_t) è un tipo aritmetico. Quindi, inizializzato a zero.
Altri suggerimenti
Questo non ha nulla a che fare con il tipo - ha a che fare con la classe di memoria. In C, le variabili statiche e globali vengono inizializzati automaticamente a 0. variabili ordinarie locali (auto) non vengono inizializzate automaticamente, in modo da avere a che fare da soli o faranno contenere spazzatura.
Credo Objective-C segue le stesse regole di C per questo.
variabili statiche e globali vengono inizializzati a 0 mentre (auto) ossia le variabili locali non sono pronte e possono iniziare con un valore imprevedibile.
Detto questo, non fa male per inizializzare in modo esplicito il valore a 0.