iPhone: небольшая проблема утечки памяти с NSTimer - PullRequest
3 голосов
/ 04 декабря 2010

предположим, у меня есть кнопка с присоединенным IBAction, которая при нажатии запускает несколько действий, НО должна запускать определенное действие с задержкой в ​​одну секунду, И только если пользователь не нажимает кнопку новое время в этой задержкеодной секунды.Код выглядит следующим образом:

   @interface Image : UIView {
           NSTimer *timer;
   }
   ...other things...;
   @end

   @implementation Image
   -(IBAction)startStopTimer{
   ...do something...;
   ...do something...;

   [timer invalidate];
   timer = [[NSTimer scheduledTimerWithTimeInterval:0.7 
      target:self 
      selector:@selector(delayedAction) 
      userInfo:nil 
      repeats:NO] retain];
   }

   -(void)delayedAction{
   ...do other things...;
   }
   @end

Как есть, этот код работает очень хорошо: «delaiAvance» срабатывает только в том случае, если пользователь НЕ нажимает кнопку еще раз и ждет по крайней мере одну секунду.

Большая проблема: при каждом срабатывании таймера происходит утечка памяти.

Итак, вопрос: как и где я должен выпустить этот NSTimer?

([освобождение таймера] в методе dealloc не работает.)

Ответы [ 2 ]

5 голосов
/ 04 декабря 2010

Насколько мне известно, вы не сохраняете NSTimer объекты, потому что они сохраняются "системой". И, выполнив invalidate, вы освобождаете его от системы.

Лучше всего в любом случае, вероятно, использовать performSelector:withObject:afterDelay:, поскольку это позволит вам легко отменить триггер, и вам не нужно будет создавать целый объект для этого ... Если я правильно понимаю ваш вопрос. Чтобы запустить таймер, вы должны сделать

- (void)buttonPressed
{
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doSomething) object:nil];
    [self performSelector:@selector(doSomething) withObject:nil afterDelay:0.7];
}

- (void)doSomething
{
     NSLog(@"Something happens now!");
}

Причина отмены заключается в том, что при повторном нажатии кнопки в течение 0,7 секунд «таймер» отменяется и создается новый.

0 голосов
/ 04 декабря 2010

Итак, вопрос в том, как и где мне выпустить этот NSTimer?

Вы этого не делаете.Цикл выполнения сохраняет таймер для вас и сбрасывает его через некоторое время после вызова метода invalidate, поэтому все, что вам нужно сделать, это сбросить дополнительные retain в вызове на scheduledTimerWithTimeInterval.

...