2009-05-21 3 views
0

私は、加速/減速、スピードなどの物理計算のためのいくつかの有用な方法を持っています。どのようにして値を記憶することができるクラスメソッドだけでクラスを作ることができますか? Core Animationはどうしていますか?

これらのほとんどは、時間的に少なくとも2回測定する必要があります。だから私はそれらを使用するたびに、計算を必要とするオブジェクトのインスタンス変数を実装する必要があります(たとえば、加速度の計算など)。例えば

、私は加速を計算する必要がどこに、私はSLPhysics.hが含まれており、私のコードで書く:これは正常に動作します

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

。しかし、私はコアアニメーションのように動作する方法を好むでしょう。コアアニメーションは、実行する必要があることの詳細の大部分がクラスのユーザーから隠されています。

ので、v1とt1の最後の測定値を覚えておくことは、インスタンス変数を作るから私を防ぐために、私はこのように、簡単にハンドルを呼び出す好む:

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

お知らせコンテキストパラメータ。私はそれが行く方法だと思う。しかし、現在、私はこれらのクラスメソッドがどのようにしてデータ構造、例えばNSMutableDictionaryにアクセスすることができるのか、大きなアイデアはありません。インスタンス変数を作成すると、クラスメソッドはアクセスできなくなります。私がそれをインスタンスメソッドにすると、使い方が醜くて読みにくくなり、ユーザーはメモリ管理などの問題に悩まされます。また、このすべての割り当てと初期化はコストがかかりすぎるかもしれません(私は思っています)。コアアニメーションを見てください。それはとても簡単です!私はこれと同じことが欲しい。しかし、彼らもその問題を抱えていたと思います。彼らは何かを覚えていなければならない。アニメーションの時間、文脈など

私はファイルに値を書き込むことを考えましたが、それは高価すぎます。私はSQLiteを使うことができます。あまりにも高価なオペレーション、おそらく。これらの方法は、毎秒5〜100回の計算が必要な場所で使用できます。 "クラス変数"のようなものがありますか?

答えて

4

シングルトンを使用してください。あなたのクラスはそれをすべてシングルトン変数として 'クラス変数'に格納します。シングルトンをクラスメソッドstaticとして実装します。

@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 

必要に応じてスレッドの安全性を追加します。

+0

私がそうなっていれば、SLPhysicsクラスのインスタンスは1つしか存在しません。しかし誰がそれを所有していますか?オブジェクトがもはや必要でないときにオブジェクトを解放する責任は誰にありますか?それとも、私のアプリが動いている限り、それが保持されるので、私はそれを解放することを心配する必要はありませんか? – Thanks

+0

getSingletonメソッドで作成された1つの静的インスタンスが、アプリケーションの存続期間中存在します。アプリケーションを実行している間は、メモリを管理する必要はありません。この1つのクラスのメモリ使用量は(画像データなどを格納していない限り)簡単です。 –

+0

データにC構造体を使用し、すべてのNSObjectのalloc/retain/releaseの問題を回避できます。 –

関連する問題