2012-04-27 25 views
1

如果加速度计的事件处理程序需要在以下一个UIAcceleration *为什么在iOS中,我们无法声明“UIAcceleration accelerationCurrent;” ViewController类中的实例变量?

-(void) accelerometer:(UIAccelerometer *)accelerometer 
      didAccelerate:(UIAcceleration *)acceleration { 

那么如果ViewController有一个实例变量:

UIAcceleration accelerationCurrent; 

然后为了记住加速的当前状态,我使用

accelerationCurrent = *acceleration; 

在Accelerometer事件处理程序中。但.h文件中的实例变量声明给出了错误,因为“接口类型不能静态分配”。

我想UIAcceleration仅有3双打:X,Y,Z,因此,如果我们可以用CGPoint aPoint那里,为什么我们不能用UIAcceleration accelerationCurrent,以及我们如何能够保持加速而不复制X,Y,Z的个体,但使用一个UIAcceleration对象? (如果我们声明一个指针,并复制指针(引用),那么在离开加速器事件处理程序时,指针可能指向非法的内存空间)。

回答

3

尽管UIAcceleration只有四个数据成员(x,y,z和时间戳),但它不是struct,因此它不会让您静态引用它(即您需要使用指针)。这与CGPoint(它是C struct)形成了对比,因此您可以通过指针或不带指针来使用它。

不幸的是,复制你感兴趣的值是没有办法的:你绝对正确的,一旦线程离开你的处理程序,对象可能会在你的后面被重用。 UIAcceleration也不符合复制协议,因此您需要自己编写该复制例程。

+0

我想我们将需要单独复制x,y,z或者typedef我们自己的结构来完成复制?使用'CMAcceleration'应该可以工作,因为它是一个结构体?但它不会允许 – 2012-04-27 02:40:24

+0

@动静能量是的,'CMAcceleration'完全符合法案。你可以存储它,而不是三个单独的项目(除非你还需要一个时间戳,它听起来不像你这样做)。但是,您需要自己编写从'UIAcceleration'到'CMAcceleration'的转换,因此您的代码看起来像是'cmAccelCurrent = CopyToCmAcceleration(加速)'或'CopyToCmAcceleration(&cmAccelCurrent,加速度)'。 – dasblinkenlight 2012-04-27 02:45:35

相关问题