2009-07-20 14 views
1

Sprache - Objective-COrdnen Sie eine häufig verwendete Klasse nur einmal zu?

Ich verwende die SoundEffect-Klasse, um einen kurzen Sound zu spielen. Ich verwende eine NSTimer ein Aufruf dieser Methode: (. Die Zahl Sache nur so ist der Ton spielt in einem bestimmten Intervall)

- (void)count { 

count++; 
if (count == 16) { 
    NSBundle *mainBundle = [NSBundle mainBundle]; 
    SoundEffect *soundEffect = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"beep" ofType:@"aif"]]; 
    [soundEffect play]; 
    count = 0; 
} 
seconds = seconds - 0.0625; // is equal to 1/16th of a second; effectively takes off one second per second 
if (seconds == 0) { 
    [timer invalidate]; // cancels timer 
    [timer release]; 
} 

[self convertSeconds]; 

}

Wie auch immer, alles funktioniert gut, aber ich denke, es ist ineffizient, die SoundEffect-Klasse immerzu zuzuteilen und zu initialisieren, wenn mein Timer ausgelöst wird (was ziemlich oft der Fall ist). Gibt es einen Weg, auf dem ich aloc und init, wenn ich eine Taste drücke, um den Timer zu starten, und lassen Sie es zugewiesen und initialisiert, so dass alles, was ich tun muss, ist [soundEffect play]?

Danke!

+0

Normalerweise verwende ich Instanzvariablen, um Daten zu speichern, die ich wiederverwende. –

+1

Die Fülle der Singleton-Antworten sollte ignoriert werden. Es gibt keinen Hinweis darauf, dass Sie einen Singleton anstelle einer Instanzvariablen benötigen, aber der sofortige Sprung, um einen Singleton zu empfehlen, zeigt ein Patternitis- Muster. –

+0

Wenn Sie nur eine Instanzvariable verwenden möchten, geben Sie hier – Daniel

Antwort

0

Verwendung von statischen Variablen

Sie eine statische Variable innerhalb der Methode wie

- (void)count { 
    static SoundEffect *soundEffect = 
     [[SoundEffect alloc] initWithContentsOfFile: 
      [mainBundle pathForResource:@"beep" ofType:@"aif"]]; 
    ... 
} 

Hier soundEffect würde verwenden kann nur einmal beim ersten Aufruf von count initialisiert und wird so bis zum Ende bleiben der Ausführung.

Veraltet: Mit Singletons

EDIT: Entfernt Singleton Abschnitt. Ich denke nicht, dass es für die Frage relevant ist.

+2

Oder er könnte einfach soundEffect eine Instanzvariable in der Klasse machen, die die count-Methode enthält. –

+0

@Terry: +1 Instanzvariablen sind meiner Meinung nach besser als Singletons. – notnoop

+0

@Terry, ich werde das ausprobieren, danke an alle! –

3

Sie einen Zeiger auf die SoundEffect- Klasse ein Mitglied der eigenen Klasse zu machen.

0

Sie können es in Ihrem AppDelegate initialisieren und jederzeit dort zugreifen. Denken Sie daran, es ebenfalls aufzuheben.

könnte eine andere Lösung, die einen Singleton davon

1

zu machen, wenn es ein Ton ist, dass Sie nur in der count Methode verwendet werden, können Sie eine statische Variable verwenden den Trick zu tun (beachten Sie, dass dies technisch ein Speicherleck, da das Objekt nie freigegeben wird)

- (void)count { 

count++; 
if (count == 16) { 
     NSBundle *mainBundle = [NSBundle mainBundle]; 
     static SoundEffect * soundEffect = nil; 
     if (soundEffect == nil) 
      soundEffect = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"beep" ofType:@"aif"]]; 
     [soundEffect play]; 
     count = 0; 
} 
seconds = seconds - 0.0625; // is equal to 1/16th of a second; effectively takes off one second per second 
if (seconds == 0) { 
     [timer invalidate]; // cancels timer 
     [timer release]; 
} 

[self convertSeconds]; 

Dies wird nur das Objekt einmal zuweisen.

Verwandte Themen