2009-05-21 4 views
0

Ich habe einige nützliche Methoden für Physik Berechnungen wie Beschleunigung/Verzögerung, Geschwindigkeit und einige mehr.Wie kann ich eine Klasse nur mit Klassenmethoden erstellen, die Werte speichern kann? Wie macht Core Animation das?

Die meisten von ihnen erfordern mindestens zwei Messungen in Bezug auf die Zeit. Also muss ich jedes Mal, wenn ich sie verwenden möchte, eine Menge von Instanzvariablen in mein Objekt implementieren, die die Berechnung benötigen, zum Beispiel um eine Beschleunigung zu berechnen.

Zum Beispiel, wo ich auch eine Beschleunigung berechnen muß, schließe ich SLPhysics.h und in meinem Code schreiben:

double acceleration = [SLPhysics + calculateAccelerationForFirstMeasuredSpeed:v1 secondMeasuredSpeed:v2 firstMeasuredTime:t1 secondMeasuredTime:t2]; 

Dies funktioniert gut. Aber ich würde einen Weg bevorzugen, der sich wie Core Animation verhält, wo die meisten Details für das, was zu tun ist, vor dem Benutzer der Klasse verborgen sind.

Also, um mich daran zu hindern, Instanzvariablen, der diese letzten Messwert v1 und t1 zu erinnern, würde ich ein einfach zu handhaben nennen wie dies bevorzugt:

double acceleration = [SLPhysics + calculateAccelerationForMeasuredSpeed:v measuredTime:t context:self]; 

Beachten Sie den Kontextparameter. Ich denke, das ist der richtige Weg. Aber zur Zeit habe ich keine Ahnung, wie diese Klassenmethoden auf eine Datenstruktur zugreifen können, zum Beispiel ein NSMutableDictionary. Wenn ich Instanzvariablen erstellen würde, hätte die Klassenmethode keinen Zugriff. Wenn ich es zu einer Instanzmethode mache, wäre die Verwendung hässlich und schwer zu lesen, und der Benutzer würde durch die Speicherverwaltung und andere Dinge gestört werden. Auch all diese Zuweisung und Initialisierung kann zu viel kosten (denke ich). Ich meine ... schau dir Core Animation an. Das ist so einfach! Ich will das Gleiche für diese Sache. Aber sie hatten auch dieses Problem, denke ich. Sie müssen sich an etwas erinnern. Die Animationsdauer, der Kontext usw.

Ich dachte über das Schreiben von Werten in eine Datei, aber das ist zu teuer. Ich könnte SQLite verwenden. Zu teure Operationen, wahrscheinlich. Diese Methoden können an Orten verwendet werden, die 5 bis 100 Berechnungen pro Sekunde benötigen. Gibt es da Sachen wie "Klassenvariablen"?

Antwort

4

Verwenden Sie einen Singleton. Ihre Klasse speichert alle Klassenvariablen als Singleton-Variablen. Implementieren Sie den Singleton als Klassenmethode statisch:

@interface SLPhysics { 
    int a; 
    int b; 
} 

+(SLPhysics*)getSingleton; 

+calculate; 
@end 

@implementation SLPhysics 

+(SLPhysics*)getSigleton { 
static SLPhysics* singleton; 
if (null == singleton) singleton = [[SLPhysics alloc] init]; 
return singleton; 
} 

+calculate { 
    SLPhysics* singleton = [SLPhysics getSingleton]; 
    // use singleton.a singleton.b here 
} 

@end 

Fügen Sie Thread-Sicherheit hinzu, falls erforderlich.

+0

Wenn ich das richtig verstehe, wird es nur eine Instanz der SLPhysics-Klasse geben. Aber wem gehört es? Wer ist dafür verantwortlich, das Objekt freizugeben, wenn es nicht mehr benötigt wird? Oder muss ich mir keine Sorgen machen, es zu veröffentlichen, da es so lange herumläuft, wie meine App läuft? – Thanks

+0

Es gibt eine statische Instanz, die in der Methode getSingleton erstellt wurde und für die Dauer Ihrer Anwendung existiert. Nichts besitzt es oder muss seinen Speicher verwalten, da es so lange bestehen bleibt, wie Ihre Anwendung ausgeführt wird. Die Speicherbelegung für diese eine Klasse ist trivial (solange Sie keine Bilddaten oder ähnliches speichern). –

+0

Sie könnten eine C-Struktur für Daten verwenden und alle NSObject-Zuweisungs-/Retain/Release-Probleme vermeiden. –