#iphone #ios #ipad #uiviewcontroller
#iPhone #iOS #iPad #uiviewcontroller
Вопрос:
в моем приложении задействовано множество viewcontrollers, некоторые из которых загружены в память.
Пользовательский поток похож на запуск с домашнего viewcontroller, пользователь будет щелкать по последовательности viewcontrollers (я использую presentModalViewController для переходов). Иногда пользователь нажимает строку меню или что-то еще, чтобы вернуться к определенному viewcontroller, который он / она прошел в прошлом, или перейти к viewcontroller, который еще не был представлен. Итак, это похоже на: A-> B-> C-> D-> B-> D-> E-> F-> C-> I…
Что я делаю прямо сейчас: независимо от того, где находится пользователь, когда ему / ей нужно перейти к какому-либо другому viewcontroller, я просто создаю экземпляр целевого viewcontroller и представляю его как модальный viewcontroller.
Что ж, это работает хорошо, но с помощью инструментов я определил, что выделенная куча памяти продолжает увеличиваться с момента запуска приложения. Я предполагаю, что parentViewController (или presentingViewController в iOS 5) никогда не будет выпущен, потому что он находится в корне или середине модального стека представления, так что это все равно, что продолжать добавлять экземпляры viewcontroller.
Поэтому я понимаю, что делаю это неправильно. Я был бы признателен, если бы кто-нибудь мог указать мне правильное направление для создания подобных приложений.
Ответ №1:
Когда вы модально представляете контроллер представления, родительский контроллер представления остается. Вот почему использование вашей памяти растет каждый раз, когда пользователь переходит к другому контроллеру представления.
Попробуйте использовать a UINavigationController
в качестве контроллера корневого представления вашего окна. Используйте свой A
контроллер представления в качестве контроллера корневого представления навигационного контроллера. Затем, когда вы захотите перейти к своему B
контроллеру представления, сделайте это следующим образом (в каком-либо методе вашего текущего контроллера представления):
UIViewController *b = [[BViewController alloc] init...];
[self.navigationController setViewControllers:[NSArray arrayWithObject:b] animated:YES];
Пока вы не сохраняете никаких других ссылок на свои контроллеры представления A или B, они должны быть освобождены, когда они больше не видны.
Комментарии:
1. Спасибо, я попробую этот подход. Никогда не знаешь, что NavigationController может это сделать. Но, есть ли у меня все еще эффект перехода, который я получаю, представляя modalViewController?