将变量从NSTimer方法传递给选择器

时间:2014-03-09 07:30:59

标签: objective-c nstimer

我是Objective-C的初学者,不确定如何将变量从startTimer方法传递给选择器。为什么我的选择器方法不知道来自circleSize的变量starTimer?谢谢您的帮助。

- (void)startTimer:(int)circleSize
{

  self.clockTimer = [NSTimer scheduledTimerWithTimeInterval:1
                                                     target:self
                                                   selector:@selector(timerFired:)
                                                   userInfo:nil
                                                    repeats:YES];
}

- (void) timerFired:(NSTimer *)clockTimer
{
  circleSize -= 1; // Error: Use of declared identifier

  NSLog(@"What is circle now?%i", circleSize);
}

1 个答案:

答案 0 :(得分:1)

选择器不知道circleSize参数的原因是因为它在将来的某个时刻被异步调用。因此,它无法访问在其中调用startTimer方法的范围。在每个方法中添加一个断点,然后查看堆栈跟踪和局部变量以自行确认。

您需要使用实例变量或属性来包含类来存储此信息:

@implementation MyClass {
   int _circleSize;
}

- (void)startTimer:(int)circleSize
{

  _circleSize = circleSize
  self.clockTimer = [NSTimer scheduledTimerWithTimeInterval:1
                                                     target:self
                                                   selector:@selector(timerFired:)
                                                   userInfo:nil
                                                    repeats:YES];
}

- (void) timerFired:(NSTimer *)clockTimer
{
  _circleSize -= 1; // Error: Use of declared identifier

  NSLog(@"What is circle now?%i", _circleSize);
}

@end