NSTimer запускается, но не увеличивается (запись только в консоль) - PullRequest
0 голосов
/ 27 января 2012

Мой 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);
}

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Вы получаете новый x каждый раз, когда вызывается runTimer. Если вы сделаете это статичным

static int x;

это будет действовать так, как вы ожидаете. Для чистоты я бы также инициализировал его:

static int x = 0;
1 голос
/ 27 января 2012

Будьте осторожны со статическими переменными в методах Objective-C, как это предлагает smparkes.Они распределяются между всеми экземплярами этого класса, поэтому, если у вас есть несколько экземпляров любого объекта, из которого этот код, его ответ не будет действовать так, как вы ожидаете.Вам лучше использовать переменную экземпляра, потому что каждый экземпляр будет иметь свою собственную переменную, не затрагивая другие экземпляры:

В вашем .h:

@interface MyClass : NSObject
{
    int x;
}

Затем в вашем -runTimer: method:

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

Если вы гарантируете, что будет существовать только один экземпляр этого класса (например, это singleton), статическая переменная внутри метода -runTimer: будет работать, но я 'рекомендую использовать переменную экземпляра или @property, так как это лучшая практика программирования.

1 голос
/ 27 января 2012

runTimer каждый раз объявляет x, т. Е. Создает новую переменную со значением 0, увеличивает ее и распечатывает, так что она всегда будет иметь одинаковое значение. вам нужна переменная вне области действия этого метода, чтобы увеличить ее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...