NSTimer не сделает недействительным

Здесь не так много кода, но эта проблема серьезно меня раздражает!

.час:

@interface processController : UIViewController {
         NSTimer *timer;
}
@property (nonatomic, retain) NSTimer *timer;

.m:

- (void)viewDidLoad {
    [super viewDidLoad];
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector (main) userInfo:nil repeats:YES];
}
- (void)main {
    NSLog(@"testing");
}
- (void)viewDidUnload {
    [self.timer invalidate];
    self.timer = nil;
}

Странная вещь, когда я запускаю этот код:

ViewController *main = [[ViewController alloc] initWithNibName:nil bundle:nil];
    [self presentModalViewController:main animated:YES];

и переключать взгляды, таймер продолжает стрелять! Что я делаю неправильно?

1 ответ

Решение

viewDidUnload не вызывается, когда представление удаляется с экрана, а только тогда, когда приложение получает предупреждение о памяти. Он также не вызывается, когда UIViewController освобождается. Из документации Apple:

Когда возникает состояние нехватки памяти и представления текущего контроллера представления не нужны, система может выбрать удаление этих представлений из памяти. Этот метод вызывается после того, как представление контроллера представления было выпущено, и это ваш шанс выполнить окончательную очистку. Если ваш контроллер представления хранит отдельные ссылки на представление или его подпредставления, вы должны использовать этот метод для освобождения этих ссылок. Вы также можете использовать этот метод для удаления ссылок на любые объекты, которые вы создали для поддержки представления, но которые больше не нужны, когда представление исчезло. Вы не должны использовать этот метод для выпуска пользовательских данных или любой другой информации, которая не может быть легко воссоздана.

Вы, скорее всего, хотели использовать viewWillDisappear

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.timer invalidate];
    self.timer = nil;
}   

Вы, вероятно, хотите запустить свой таймер в viewWillAppear: так как viewDidLoad вызывается, как только к свойству view контроллера обращаются. Не обязательно, когда вид показан.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(main) userInfo:nil repeats:YES];
}

Я бы рекомендовал прочитать обсуждения для viewDidLoad и viewDidUnload, а также viewWillAppear и viewWillDisappear из документации по UIViewController.

Другие вопросы по тегам