Не выполнять просмотр инициализации контроллера в viewDidLoad
.Это распространенная ошибка.
Для вещей, которые должны происходить только один раз при загрузке контроллера представления, сделайте это в методе init контроллера, например:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)bundleOrNil
{
if ((self = [super initWithNibName:nibNameOrNil bundle:bundleOrNil]))
{
//do your initialisation here
}
return self;
}
initWithNibName:bundle:
метод вызывается до представление загружается из пера, и вызывается только один раз в течение срока службы контроллера представления.
Представление контроллера может загружаться и выгружаться несколько раз в течение срока службыконтроллера и viewDidLoad
будет вызываться каждый раз.Он может быть выгружен всякий раз, когда его нет на экране, обычно, если памяти мало.
Если вы настраиваете вещи в viewDidLoad
(например, добавляете подпредставления программно), вы всегда должны сбрасывать их снова в viewDidUnload
.
Думайте о viewDidLoad
и viewDidUnload
как о init / dealloc для свойства view контроллера представления.Для материала, который относится к представлениям, создайте и отпустите его в этих методах.Для вещей, которые относятся к самому контроллеру, создайте и выпустите его в initWithNibName
и dealloc
.
ОБНОВЛЕНИЕ: В iOS 6 и более поздних версиях viewDidUnload
больше никогда не вызывается(если в коде явно не установлено представление), и поэтому viewDidLoad
обычно вызывается только один раз в жизни контроллера представления.Это делает приведенные выше рекомендации менее критичными, но все же это лучшая практика, и она по-прежнему необходима, если вам требуется поддержка iOS 5 и более ранних версий.
ОБНОВЛЕНИЕ 2: Если вы загружаете контроллер представления изРаскадровка (которая сейчас является рекомендуемой практикой) вместо того, чтобы создавать ее программно, тогда initWithNibName:bundle:
не будет вызываться.Используйте initWithCoder:
или awakeFromNib
для инициализации вашего контроллера.