我有一些有用的物理计算方法,如加速/减速,速度等等。
它们中的大多数在时间方面至少需要两次测量。所以每次我想使用它们时,我都必须在我的对象中实现一堆需要计算的实例变量,例如计算加速度。
例如,无论我需要计算加速度,我都会包含SLPhysics.h并写入我的代码:
double acceleration = [SLPhysics + calculateAccelerationForFirstMeasuredSpeed:v1 secondMeasuredSpeed:v2 firstMeasuredTime:t1 secondMeasuredTime:t2];
这很好用。但我更喜欢一种行为类似于Core Animation的方式,其中大部分必须完成的细节都是从类的用户隐藏的。
所以,为了防止我让实例变量记住最后一个测量值v1和t1,我更喜欢这样一个易于处理的调用:
double acceleration = [SLPhysics + calculateAccelerationForMeasuredSpeed:v measuredTime:t context:self];
注意上下文参数。我认为这是要走的路。但目前我不知道这些类方法如何访问数据结构,例如NSMutableDictionary。如果我要创建实例变量,则类方法将无法访问。如果我使它成为一个实例方法,那么使用将是丑陋的并且难以阅读,并且用户会受到内存管理和其他东西的困扰。所有这些分配和初始化都可能花费太多(我认为)。我的意思是......看看Core Animation。那太容易了!我想要同样的事情。但我猜他们也有这个问题。他们必须记住一些东西。动画持续时间,上下文等
我考虑过将值写入文件,但这太贵了。我可以使用SQLite。太昂贵的操作,可能。这些方法可用于每秒需要5到100次计算的地方。不是有“类变量”之类的东西吗?
答案 0 :(得分: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
如果需要,添加线程安全。