Управление памятью iOS - предупреждения о нехватке памяти и viewDidUnload

Я получаю эту ошибку, когда я получаю предупреждение памяти:

*** -[TheViewController_iPhone productImages]: message sent to deallocated instance

Xcode показывает ошибку в строке, указанной ниже:

- (void)viewDidUnload
{
    [super viewDidUnload];

    [self.productTimer invalidate];
    //self.productTimer = nil;

    for(UIView *subview in [self.productImages subviews]) { //THIS LINE IS THE ERROR
        [subview removeFromSuperview];
    }
}

Итак, мой вопрос, почему productImages (который является scrollView) освобождается в этой точке? Разве я не получу шанс сбросить его подпредставления?

Это определяется так:

@property (weak, nonatomic) IBOutlet UIScrollView *productImages;

1 ответ

Решение

Ваше представление контроллера представления уже было выгружено, когда viewDidUnload вызывается. Это означает, что любые подпредставления представления больше не будут сохранены представлением. Я предполагаю что productImages это подпредставление представления контроллера представления. В этом случае вы должны объявить productImages как strong вместо weak если вы хотите, чтобы он все еще был доступен после выгрузки вида.

Еще одно замечание: очень плохая практика - начинать повторять таймеры в viewDidLoad в признании их недействительными в viewDidUnload, Гораздо лучше сделать это в viewDidAppear: а также viewWillDisappear:, Смотрите это сообщение в блоге для подробного объяснения http://antonholmquist.com/blog/why-you-really-shouldnt-create-repeating-nstimers-in-init-or-viewdidload/

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