Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 我怎样才能创建一个只有类方法的类,它能够记住值?核心动画是如何做到这一点的?_Iphone_Uikit_Core Animation - Fatal编程技术网

Iphone 我怎样才能创建一个只有类方法的类,它能够记住值?核心动画是如何做到这一点的?

Iphone 我怎样才能创建一个只有类方法的类,它能够记住值?核心动画是如何做到这一点的?,iphone,uikit,core-animation,Iphone,Uikit,Core Animation,我有一些有用的物理计算方法,比如加速/减速、速度等等 其中大多数都要求在时间上至少分开两次测量。所以每次我想使用它们时,我必须在我的对象中实现一组需要计算的实例变量,例如,计算加速度 例如,在需要计算加速度的任何地方,我都会包含SLPhysics.h并在代码中编写: double acceleration = [SLPhysics + calculateAccelerationForFirstMeasuredSpeed:v1 secondMeasuredSpeed:v2 firstMeasure

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

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

例如,在需要计算加速度的任何地方,我都会包含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次计算的地方。难道没有“类变量”之类的东西吗?

使用单例。您的类将所有“类变量”存储为单例变量。将singleton实现为静态类方法:

@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

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

使用单线程。您的类将所有“类变量”存储为单例变量。将singleton实现为静态类方法:

@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

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

如果我没有弄错,那么SLPhysics类只有一个实例。但谁拥有它?当不再需要该对象时,谁负责释放该对象?或者我不必担心发布它,因为只要我的应用程序运行,它就会一直存在?有一个在getSingleton方法中创建的静态实例,在应用程序运行期间存在。没有任何东西拥有它或需要管理它的内存,因为只要应用程序运行,它就会一直存在。这一类的内存使用将是微不足道的(只要您不在其中存储图像数据或类似内容)。您可以使用C结构来存储数据,并避免所有NSObject alloc/retain/release问题。如果我没有弄错,那么SLPhysics类将只有一个实例。但谁拥有它?当不再需要该对象时,谁负责释放该对象?或者我不必担心发布它,因为只要我的应用程序运行,它就会一直存在?有一个在getSingleton方法中创建的静态实例,在应用程序运行期间存在。没有任何东西拥有它或需要管理它的内存,因为只要应用程序运行,它就会一直存在。这一类的内存使用量很小(只要不在其中存储图像数据或类似数据)。可以使用C结构来存储数据,并避免所有NSObject alloc/retain/release问题。