Objective c NSTimer激发但不递增(仅写入控制台)

Objective c NSTimer激发但不递增(仅写入控制台),objective-c,Objective C,我的NSTimer(startTimer)工作正常。它运行所选的方法(runTimer),但无论我在(runTimer)中放置什么代码,它都不会递增。例如,如果我运行下面的代码,它会打印5次,但不会增加x。有什么想法吗?谢谢 - (void)startTimer { self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(runTimer:) userInfo

我的NSTimer(startTimer)工作正常。它运行所选的方法(runTimer),但无论我在(runTimer)中放置什么代码,它都不会递增。例如,如果我运行下面的代码,它会打印5次,但不会增加x。有什么想法吗?谢谢

- (void)startTimer {
    self.timer  = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self     selector:@selector(runTimer:) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]];
    }
- (void)runTimer:(NSTimer *)aTimer {
    int x;
    x++;
    NSLog(@"int x = %i",x);
}

每次调用
runTimer
时,您都会得到一个新的
x
。如果你让它静止

static int x;
它会按你期望的方式运行。对于清洁度,我还要初始化它:

static int x = 0;

每次调用
runTimer
时,您都会得到一个新的
x
。如果你让它静止

static int x;
它会按你期望的方式运行。对于清洁度,我还要初始化它:

static int x = 0;

runTimer每次都声明x,即它创建一个新变量,设置为0,递增并打印出来,所以它总是相同的值。您需要一个超出该方法范围的变量,以便每次递增它,即它创建一个新变量,设置为0,递增并打印出来,因此它始终是相同的值。您需要一个超出该方法范围的变量来增加它

请按照Smparks的建议小心使用Objective-C方法中的静态变量。它们在该类的所有实例之间共享,因此,如果您拥有该代码来自的任何对象的多个实例,那么他的答案不会按您预期的方式执行。最好使用实例变量,因为每个实例都有自己的变量,而不会影响其他实例:

在您的.h中:

@interface MyClass : NSObject
{
    int x;
}
然后在
-runTimer:
方法中:

- (void)runTimer:(NSTimer *)aTimer {
    NSLog(@"int x = %i", x++);
}

如果保证该类只有一个实例(例如,它是一个单实例),则
-runTimer:
方法中的静态变量将起作用,但是我建议使用实例变量或@property,因为这是更好的编程实践。

在Objective-C方法中小心使用静态变量,正如Smparks建议的那样。它们在该类的所有实例之间共享,因此,如果您拥有该代码来自的任何对象的多个实例,那么他的答案不会按您预期的方式执行。最好使用实例变量,因为每个实例都有自己的变量,而不会影响其他实例:

在您的.h中:

@interface MyClass : NSObject
{
    int x;
}
然后在
-runTimer:
方法中:

- (void)runTimer:(NSTimer *)aTimer {
    NSLog(@"int x = %i", x++);
}

如果您保证这个类只有一个实例(例如,它是一个单例),则
-runTimer:
方法中的静态变量可以工作,但我建议使用实例变量或@property,因为这是更好的编程实践。

谢谢大家-我现在明白了。我刚刚创建了一个ivar int(int-num)集属性,并用self.num+=1重新运行代码,一切正常。很高兴听到这个消息。请单击答案左侧的复选标记,确保您接受对您最有帮助的答案。这样做给了未来的回答者更多的帮助的动力。谢谢大家——我现在明白了。我刚刚创建了一个ivar int(int-num)集属性,并用self.num+=1重新运行代码,一切正常。很高兴听到这个消息。请单击答案左侧的复选标记,确保您接受对您最有帮助的答案。这样做会给未来的回答者更多的帮助动机。