2009-05-21 7 views
0

J'ai quelques méthodes utiles pour les calculs de physique comme l'accélération/décélération, la vitesse, et un peu plus.Comment puis-je créer une classe avec seulement des méthodes de classe, capable de mémoriser des valeurs? Comment Core Animation fait-il cela?

La plupart d'entre eux nécessitent au moins deux mesures en termes de temps. Donc, chaque fois que je veux les utiliser, je dois implémenter un tas de variables d'instance dans mon objet qui a besoin du calcul, par exemple pour calculer une accélération.

Par exemple, chaque fois que je dois calculer une accélération, je SLPhysics.h et écris inclus dans mon code:

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

Cela fonctionne très bien. Mais je préférerais une manière qui se comporte comme Core Animation, où la plupart des détails pour faire ce qui doit être fait sont cachés à l'utilisateur de la classe.

Alors, pour me empêcher de faire des variables d'instance de se rappeler les dernières valeurs mesurées v1 et t1, je préférerais un simple à manipuler appeler comme ceci:

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

Notez que le paramètre de contexte. Je pense que c'est la voie à suivre. Mais actuellement, je n'ai aucune grande idée de la façon dont ces méthodes de classe peuvent avoir accès à une structure de données, par exemple un NSMutableDictionary. Si je devais faire des variables d'instance, la méthode de classe n'aurait aucun accès. Si je fais une méthode d'instance, l'utilisation serait moche et difficile à lire, et l'utilisateur serait dérangé par la gestion de la mémoire et d'autres choses. De plus, toute cette allocation et initialisation peut coûter trop cher (je pense). Je veux dire ... regarde Core Animation. C'est si facile! Je veux la même chose pour ça. Mais ils avaient aussi ce problème, je suppose. Ils doivent se souvenir de certaines choses. La durée de l'animation, le contexte, etc.

Je pensais écrire des valeurs dans un fichier, mais c'est trop cher. Je pourrais utiliser SQLite. Opérations trop chères, probablys. Ces méthodes peuvent être utilisées dans des endroits qui nécessitent 5 à 100 calculs par seconde. Arent il y a des choses comme "variables de classe"?

Répondre

4

Utilisez un singleton. Votre classe stocker toutes ses variables de classe en tant que variables singleton. Implémentez le singleton en tant que méthode de classe statique:

@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 

Ajoutez la sécurité des threads si nécessaire.

+0

Si je comprends bien, il n'y aura qu'une seule instance de la classe SLPhysics. Mais à qui appartient-il? Qui est responsable de libérer l'objet quand ce n'est plus nécessaire? Ou est-ce que je n'ai pas à me soucier de le relâcher, car il sera conservé aussi longtemps que mon application fonctionne? – Thanks

+0

Une instance statique, créée dans la méthode getSingleton, existe pour la durée de votre application. Rien ne le possède ou n'a besoin de gérer sa mémoire, car il restera aussi longtemps que votre application est en cours d'exécution. L'utilisation de la mémoire pour cette classe sera triviale (tant que vous ne stockez pas de données d'image ou similaire). –

+0

Vous pouvez utiliser une structure C pour les données et éviter tous les problèmes d'allocation/de conservation/libération de NSObject. –

Questions connexes