Выпуск IBOutlets в viewDidUnload UIViewController?

Я немного смущен относительно того, что происходит точно в Основанном на пере UIViewControllers. При генерации a UIViewController подкласс, шаблон содержит очень определенный комментарий в viewDidUnload метод:

// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;

К которым подпредставлениям это применяется?

  • Те я инициализировал в viewDidLoad? (Я сказал бы да),
  • Те я инициализировал в initWithNibName? (Я сказал бы "нет"),
  • IBOutlets, которому ссылка возражает в Пере?

Если я использую контроллер представления как это:

MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];
[controller release];

В этом случае я предполагаю, что не имеет значения очень, выпущены ли переменные экземпляра, которые содержат ссылки на подпредставление, в viewDidUnload или dealloc с тех пор dealloc должен быть назван, как только контроллер представления выталкивается от стека, таким образом, я мог бы также сделать, как Apple заявляет и переменные экземпляра выпуска относительно viewDidUnload вместо dealloc.

Но предположите, что я использовал MyViewController как переменная экземпляра, которая может быть продвинута многократно:

if(self.myViewController == nil) {
    self.myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
}
//Change some state which should be reflected in the view
self.myViewController.someProperty = someValue;
[self.navigationController pushViewController:self.myViewController animated:YES];

Что происходит в MyViewController если я выпускаю IBOutlet в viewDidUnload? Я могу рассчитывать на наличие новой ссылки на него на следующем viewDidLoad?

Другими словами: что происходит с самим представлением после viewDidUnload? Это выпущено и перезагружено от Пера, если контроллер продвинут снова? Или представление остается в памяти? И если так, сделайте выходы сбрасываются прежде viewDidLoad?

Если любой, которым представление остается в памяти и выходах, сбрасывается прежде viewDidLoad или перезагружается каждый раз, когда контроллер продвинут, я предполагаю, что это было бы корректно для выпуска выходов в viewDidUnload (даже при том, что в первом случае это не имеет значения). Но иначе (конкретно, если представление остается в памяти и выходах, НЕ сбрасываются), выпуская подпредставления в viewDidUnload является неправильным при варианте использования, который я представил, я корректен?

7
задан Kampai 8 August 2014 в 17:19
поделиться

1 ответ

Из документации UIViewController, раздел Memory Management:

Когда возникает предупреждение о нехватке памяти, класс UIViewController очищает свои представления, если знает, что сможет перезагрузить или воссоздать их позже. Если это происходит, он также вызывает метод viewDidUnload, чтобы дать вашему коду шанс отказаться от владения любыми объектами, связанными с вашей иерархией представлений, включая объекты, загруженные с nib-файлом, объекты, созданные в вашем методе viewDidLoad, и объекты, лениво созданные во время выполнения и добавленные в иерархию представлений. Обычно, если ваш контроллер представления содержит аутлеты (свойства или необработанные переменные, содержащие ключевое слово IBOutlet), вы должны использовать метод viewDidUnload, чтобы отказаться от владения этими аутлетами или любыми другими данными, связанными с представлением, которые вам больше не нужны.

Так что вы не только можете освободить свои розетки в viewDidUnload, это предпочтительный и рекомендуемый способ.

И да, вы можете рассчитывать на то, что при вызове viewDidLoad ваши аутлеты будут указывать на действительные объекты. Снова из документации UIViewController, о viewDidLoad:

Этот метод вызывается после того, как контроллер представлений загрузил в память связанные с ним представления.

7
ответ дан 7 December 2019 в 07:40
поделиться