Как справиться с ситуацией, когда страница выгружается из-за нехватки памяти

#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 только для всего, что было создано ws viewDidLoad , думая о двух методах как о согласованной паре. У меня такое чувство, что в какой-то момент вы устанавливаете id равным нулю, как сказал @rog

3. Paul.s Я думаю, вы правы в этом. На самом деле я устанавливаю больше, чем то, что я имел в виду, загружалось до нуля.

Ответ №1:

Во-первых, вы должны сохранить свой объект UserProfileTableViewController в ivar делегата приложения (поскольку вы выделяете его там). Во-вторых, заставьте делегата приложения предоставить этот идентификатор пользователя контроллеру. В-третьих, если навигационный контроллер удален из интерфейса / освобожден, то даже при нехватке памяти ваш uptvc также не должен быть освобожден. Контроллеры представлений поддерживают полную иерархию контроллеров, даже когда заканчивается память, удаляются только представления и все, что вы говорите им удалить.

Вы, безусловно, хотите сохранить UINavigationController также в ivar AppDelegate.

Комментарии:

1. 1. Вам не нужно хранить uptvc в ivar, поскольку он не принадлежит appDelegate ит, которым он принадлежит UINavigationController . 2. Это уже сделано в третьей строке. Вполне может быть разумно сохранить ivar UINavigationController для удобства доступа позже. Проблема заключалась в том, что идентификатор терялся, и простое наличие другого указателя не остановит viewDidUnload вызов