Frage

- (void)playAlarmSound:(NSTimer *)theTimer {
    static SystemSoundID soundID/* = 0 */; // ?
    if (!soundID) {
        soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];
    }
    ...
}

Ist SystemsoundID (welches ist ein Uint32) automatisch 0 zugewiesen? Oder sollte ich es explizit zuweisen? Ich muss es so machen und testen, ob es nicht von der Versorgungsmethode initialisiert wurde, da sie nicht kompiliert wird, wenn ich es einfach tue static SystemSoundID soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];. Zuerst habe ich versucht, es Null zuzuweisen, aber dann wurde mir klar, dass es kein Zeiger ist, also sollte ich das haben = 0 da drin oder ist es überflüssig?

War es hilfreich?

Lösung

Diese Frage beinhaltet keine objektiven C-Funktionen, daher findet sich die Antwort im C-Standard.

C99, Abschnitt §6.7.8, Absatz 10:

Wenn ein Objekt mit einer statischen Speicherdauer nicht explizit initialisiert wird, dann:

...

- Wenn es einen arithmetischen Typ hat, wird es in (positiv oder nicht signiert) Null initialisiert;

Uint32 (was selbst nur uint32_t ist) ist ein arithmetischer Typ. Daher auf Null initialisiert.

Andere Tipps

Dies hat nichts mit dem Typ zu tun - es hat mit der Speicherklasse zu tun. In C werden statische und globale Variablen automatisch auf 0 initialisiert. Gewöhnliche lokale (Auto-) Variablen werden nicht automatisch initialisiert, sodass Sie es selbst tun müssen oder sie Müll enthalten.

Ich glaube, Objective-C befolgt dieselben Regeln wie C dafür.

Statische und globale Variablen werden auf 0 initialisiert, während lokale (dh Auto) Variablen nicht initialisiert werden und mit einem unvorhersehbaren Wert beginnen können.

Das heißt, es tut nicht weh, den Wert explizit auf 0 zu initialisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top