如何最好地存储一个在整个方法执行过程中多次使用的变量并保持不变?

时间:2013-12-20 01:56:59

标签: ios objective-c

假设我正在使用UIPanGestureRecognizer处理平移手势,并且每次在平移视图时调用该函数时我想知道初始点。所以我将它保存到一个变量中,并且每调用一次该函数,我就可以访问这个不变的变量,因为我得到它的原始值(比如,第一次调用函数我保存它的值)将被更改因为函数被更多地调用。

静态变量似乎不像我执行以下操作那样工作:

static CGFloat originalImageTopPosition = CGRectGetMinY(self.imageBeingOverlayedScrollView.frame);

我明白了:

  

Initializer元素不是编译时常量。

我可以使用property,但如果有大量案例我需要这样的事情,那么使用随机保存的值来混淆我的属性列表似乎是一个糟糕的选择。

3 个答案:

答案 0 :(得分:0)

您可以声明一个静态变量而不初始化它(或初始化为零或其他东西),然后在初始化方法中设置它。

答案 1 :(得分:0)

这取决于具体情况。对于处理平移手势的示例,您可以将值分配给if子句中的局部变量,如下所示:

CGPoint point;
if (sender.state == UIGestureRecognizerStateBegan){
    point = [sender locationInView:nil];
}

这只会在平移手势期间调用一次,因此您可以在手势的平移阶段使用此点进行计算。

答案 2 :(得分:0)

好漂浮是一个小小的趋势,一般你会使用某种神奇的价值,假设你想要0有效有一点浮动技巧你可以使用

static float blah = 0/0.f;

if (blah!=blah) 
{
    blah = 3.4;
}

基本上你使用的编译时常量是NaN,然后​​是NaN!= NaN ...然后你可以在运行时设置。

所以对你的情况来说就是......

static CGFloat originalImageTopPosition = 0.0/0.0;

if(originalImageTopPosition!=originalImageTopPosition)
{ 
    originalImageTopPosition = CGRectGetMinY(self.imageBeingOverlayedScrollView.frame);
}

编辑 - 只想到一种不那么神秘的方式......

static CGFloat * originalImageTopPositionPtr = NULL;
static CGFloat originalImageTopPosition = 0.0/0.0;

if(!originalImageTopPositionPtr)
{
    originalImageTopPosition = CGRectGetMinY(self.imageBeingOverlayedScrollView.frame);
    originalImageTopPositionPtr = &originalImageTopPosition;
}

和更加神秘的方式......

static BOOL originalImageTopPositionInited = NO;
static CGFloat originalImageTopPosition = 0.0/0.0;

if(!originalImageTopPositionInited)
{
    originalImageTopPosition = CGRectGetMinY(self.imageBeingOverlayedScrollView.frame);
    originalImageTopPositionInited = YES;
}