如何只使用类方法创建一个能够记住值的类? Core Animation如何做到这一点?

时间:2009-05-21 07:25:46

标签: iphone uikit core-animation

我有一些有用的物理计算方法,如加速/减速,速度等等。

它们中的大多数在时间方面至少需要两次测量。所以每次我想使用它们时,我都必须在我的对象中实现一堆需要计算的实例变量,例如计算加速度。

例如,无论我需要计算加速度,我都会包含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次计算的地方。不是有“类变量”之类的东西吗?

1 个答案:

答案 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

如果需要,添加线程安全。