Я немного смущен относительно того, что происходит точно в Основанном на пере UIViewController
s. При генерации a UIViewController
подкласс, шаблон содержит очень определенный комментарий в viewDidUnload
метод:
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
К которым подпредставлениям это применяется?
viewDidLoad
? (Я сказал бы да),initWithNibName
? (Я сказал бы "нет"),Если я использую контроллер представления как это:
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
является неправильным при варианте использования, который я представил, я корректен?
Из документации UIViewController, раздел Memory Management:
Когда возникает предупреждение о нехватке памяти, класс
UIViewController
очищает свои представления, если знает, что сможет перезагрузить или воссоздать их позже. Если это происходит, он также вызывает методviewDidUnload
, чтобы дать вашему коду шанс отказаться от владения любыми объектами, связанными с вашей иерархией представлений, включая объекты, загруженные с nib-файлом, объекты, созданные в вашем методеviewDidLoad
, и объекты, лениво созданные во время выполнения и добавленные в иерархию представлений. Обычно, если ваш контроллер представления содержит аутлеты (свойства или необработанные переменные, содержащие ключевое словоIBOutlet
), вы должны использовать методviewDidUnload
, чтобы отказаться от владения этими аутлетами или любыми другими данными, связанными с представлением, которые вам больше не нужны.
Так что вы не только можете освободить свои розетки в viewDidUnload
, это предпочтительный и рекомендуемый способ.
И да, вы можете рассчитывать на то, что при вызове viewDidLoad
ваши аутлеты будут указывать на действительные объекты. Снова из документации UIViewController, о viewDidLoad
:
Этот метод вызывается после того, как контроллер представлений загрузил в память связанные с ним представления.