Не вызывайте метод dealloc, когда я использую layoutSubviews или didMoveToSuperview - PullRequest
0 голосов
/ 04 мая 2011

У меня есть XIB с UIView. Этот UIView связан (в IB) с пользовательским классом UIView - Page1. Владельцем файла является MainMenuController (конечно, UIViewController). Я использую этот XIB, когда init контроллер с "initWithNibName" и добавляю его в navController.viewControllers.

В Page1.m я пишу:

- (void)didMoveToSuperview
{
    NSLog(@"Page 1 did move to superview");
    mainTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(refreshDateAndTime) userInfo:nil repeats:YES];
}

-(void) refreshDateAndTime {
    NSLog(@"second");
}

- (void)dealloc
{
    NSLog(@"Page1 dealloc called");
    [mainTimer invalidate];
    mainTimer = nil;
    [mainTimer release]; 
    [super dealloc];
}

Когда я запускаю таймер "mainTimer" с помощью этого кода, метод "dealloc" не вызывается и объект не выгружается из памяти, а таймер работает. Если я комментирую строки в блоке didMoveToSuperview, вызывается dealloc, и все в порядке. Почему?

1 Ответ

0 голосов
/ 04 мая 2011

Dealloc будет вызываться только в том случае, если у вашего объекта нет остатков (т. Е. После вашего последнего выпуска).

Когда вы создаете свой таймер, вы говорите ему, что его цель - self.Чтобы избежать осложнений позже (т. Е. После того, как self будет освобожден из памяти, а ваш таймер все еще активен, он поэтому сохраняет self. Таймеры сохранят свои цели .

Это означает, что у вас есть еще одно сохранение, что означает, что dealloc не будет вызываться (он все еще сохраняется таймером).

По сути, не используйте dealloc для аннулирования вашего таймера.- использовать что-то еще (возможно, метод, который срабатывает, когда ваш таймер больше не требуется).

...