Как работать с NSTimer - PullRequest
       3

Как работать с NSTimer

3 голосов
/ 09 августа 2010

Я использую много таймеров в моем приложении.Для записи времени, движущегося объекта, затухания и т. Д. Я использую один и тот же таймер для нескольких целей в одном и том же виде в разное время.Как мне правильно объявить и аннулировать или освободить мои таймеры?

Atm Я объявляю таймеры так:

fadeTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(bortInfo) userInfo:nil repeats:YES];

и как только я им не пользуюсь, я делаю это:

[fadeTimer invalidate]; 
fadeTimer = nil;

Счетчик сохранения при выходе из просмотра равен 0 для каждого таймера.Должен ли я отпустить таймер в dealloc, а?Мое приложение работает довольно хорошо, но время от времени оно падает.

ClockTimer, который я использую для обновления метки со временем, использует

[[NSRunLoop mainRunLoop] addTimer:clockTimer forMode:NSRunLoopCommonModes];

Нужно ли мне что-то делать с этимmainLoop, как только я аннулирую clockTimer?

В целом, пожалуйста, поддержите меня некоторой информацией о работе с таймерами.

Большое спасибо!

Joakim

Ответы [ 3 ]

7 голосов
/ 09 августа 2010

Вы не сохраняете свои таймеры должным образом - если вы хотите обратиться к ним снова, вы должны сохранить их.Я сделал бы это со свойством, т.е. в вашем заголовочном файле

@property (nonatomic, retain) NSTimer *fadeTimer;

, и изменил бы ваш код на:

self.fadeTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(bortInfo) userInfo:nil repeats:YES];

// Put this whenever you want to remove your timer and in your dealloc method.
[fadeTimer invalidate];
self.fadeTimer = nil;

. Это обеспечит сохранение вашего таймера вашим объектом.В противном случае вам просто нужно надеяться, что таймер останется и не будет автоматически выпущен iPhone.И поскольку вы говорите, что он иногда падает, это может быть причиной;)

Боюсь, я не знаю много о цикле выполнения, но запутался, почему вы не просто используете обычный NSTimer дляпланировать вещи - зачем вообще работать с циклом выполнения?

3 голосов
/ 09 августа 2010
  • Запланированные таймеры сохраняются циклом выполнения и сохраняют свою цель. Если вы хотите сохранить таймер, вы должны перепрыгнуть через несколько обручей, чтобы предотвратить цикл сохранения (я написал не сохраняющий прокси-класс, который немного грязный, но он работает).
  • Не манипулируйте циклом выполнения, если вы не знаете, что делаете (я не знаю). «Запланированный» таймер уже добавлен в основной цикл выполнения. Если вы генерируете clockTimer, как fadeTimer, то он добавляется в цикл выполнения дважды.
  • "время от времени он падает" никому не помогает. Запустите его в отладчике и посмотрите, где он падает. Если вам повезет, он может даже напечатать некоторые сообщения на консоль.
0 голосов
/ 10 декабря 2012
*also you can use and this is a better and optimize way to write this line
if (theTimer != nil) {
        if([theTimer isValid]){
            [theTimer invalidate];
        }
        theTimer = nil;
    }*
...