Управление памятью 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/