#objective-c #ios #memory-management
#objective-c #iOS #управление памятью
Вопрос:
//In App Delegate
UserProfileTableViewController *uptvc = [[UserProfileTableViewController alloc]init];
UITabBarItem *tempTabBarItem4 = [[UITabBarItem alloc]initWithTitle:@"Fans" image:nil tag:FANSTAB_INDEX];
//I am setting the user id information here directly in app delegate
uptvc.userId = [[UserStockInfo sharedUserStockInfo]getUserId];
UINavigationController *navconUptvc = [[UINavigationController alloc]initWithRootViewController:uptvc];
Проблема возникает, когда мой UserProfileTableViewController выгружается из-за нехватки памяти (возможно, из-за использования функции камеры в моем приложении). Страница не сможет загрузиться должным образом, поскольку на ней отсутствует информация «Идентификатор пользователя», переданная делегатом приложения (как показано выше). Я не могу установить эту информацию об идентификаторе пользователя непосредственно в UserProfileTableViewController (в методе view did load), поскольку другие страницы могут передавать другой идентификатор пользователя при загрузке страницы в свой стек.
Любой совет о том, как я могу решить эту проблему?
Комментарии:
1. ваше представление выгружается, а не освобождается, поэтому ваш идентификатор пользователя не должен быть потерян, если вы не устанавливаете для него значение nil в своем
viewDidUnLoad
методе, и в этом случае вам просто не следует устанавливать для него значение nil.2. Можем ли мы увидеть ваш
viewDidUnload
метод? Вы должны освобождать / устанавливать значение nil только для всего, что было создано wsviewDidLoad
, думая о двух методах как о согласованной паре. У меня такое чувство, что в какой-то момент вы устанавливаете id равным нулю, как сказал @rog3. Paul.s Я думаю, вы правы в этом. На самом деле я устанавливаю больше, чем то, что я имел в виду, загружалось до нуля.
Ответ №1:
Во-первых, вы должны сохранить свой объект UserProfileTableViewController в ivar делегата приложения (поскольку вы выделяете его там). Во-вторых, заставьте делегата приложения предоставить этот идентификатор пользователя контроллеру. В-третьих, если навигационный контроллер удален из интерфейса / освобожден, то даже при нехватке памяти ваш uptvc также не должен быть освобожден. Контроллеры представлений поддерживают полную иерархию контроллеров, даже когда заканчивается память, удаляются только представления и все, что вы говорите им удалить.
Вы, безусловно, хотите сохранить UINavigationController также в ivar AppDelegate.
Комментарии:
1. 1. Вам не нужно хранить
uptvc
в ivar, поскольку он не принадлежитappDelegate
ит, которым он принадлежитUINavigationController
. 2. Это уже сделано в третьей строке. Вполне может быть разумно сохранить ivarUINavigationController
для удобства доступа позже. Проблема заключалась в том, что идентификатор терялся, и простое наличие другого указателя не остановитviewDidUnload
вызов