Предупреждение о памяти в Iphone освобождает все значения, извлеченные из базы данных в iPhone

#iphone #memory-management #memory-leaks #uinavigationcontroller

#iPhone #управление памятью #утечки памяти #uinavigationcontroller

Вопрос:

У меня есть приложение для iPhone на основе навигации. в середине приложения иногда я получаю предупреждение о памяти уровня 1 и 2. Внезапно все значения, которые я извлек из базы данных и создал на основе пользовательского ввода в root viewcontroller, включая значения, которые я сохранил в nsuserdefaults, полностью исчезли. Когда я пытаюсь вернуться к контроллеру корневого представления, у меня пустое табличное представление без каких-либо данных.

Как справиться с этой проблемой, пожалуйста, предложите какое-либо решение этой проблемы?

Ответ №1:

Вот как это работает, «к сожалению». Когда didReceiveMemoryWarning поступает, ваши представления освобождаются, и это объясняет, почему вы не находите никакого значения в таблице.

Что нужно сделать, так это быть готовым к повторному созданию всех представлений, согласно Документам Apple.

Реализация этого метода по умолчанию проверяет, может ли контроллер представления безопасно освободить свое представление. Это возможно, если само представление не имеет супервизора и может быть перезагружено либо из файла nib, либо с использованием пользовательского метода loadView. Если представление может быть освобождено, этот метод освобождает его и вызывает метод viewDidUnload.

Вы можете переопределить этот метод (при необходимости), чтобы освободить любую дополнительную память, используемую вашим контроллером просмотра. Если вы это сделаете, обязательно вызовите реализацию super в какой-то момент, чтобы позволить контроллеру представления освободить свое представление. В iOS 3.0 и более поздних версиях, если ваш контроллер представления содержит ссылки на объекты в иерархии представлений, вы должны освободить эти ссылки в методе viewDidUnload вместо этого. В более ранних версиях iOS вы должны продолжать освобождать их с помощью этого метода. Смотрите обсуждение в методе viewDidUnload для получения информации о том, как безопасно освобождать розетки и другие объекты.

Если вы хотите реализовать эти рекомендации, способ сделать это:

  1. используйте viewDidLoad / viewDidUnload для «сохранения / восстановления» ваших данных;

  2. храните свои данные в модели, независимой от ваших представлений;

  3. в viewDidUnload , вызываемом после предупреждения`, сохраните в вашем контроллере достаточно информации о состоянии просмотра (т. Е., отображаются ли данные о клиенте, его customer / ID), чтобы вы могли воссоздать эту информацию, получив данные обратно из модели;

  4. в viewDidLoad , вызываемый также при восстановлении представления после предупреждения о памяти, используйте информацию, сохраненную в вашем контроллере представления (если она там есть), чтобы воссоздать представление в точном состоянии, в котором оно было оставлено (в противном случае, переведите его в состояние по умолчанию).

Это должно упростить задачу.

Один трюк, который вы могли бы применить, если это имеет смысл для вас, заключается в следующем:

  1. переопределите -didReceiveMemoryWarning в ваших контроллерах просмотра;

  2. для любого представления, которое вы действительно не хотите автоматически освобождать, не вызывайте [super didReceiveMemoryWarning] в своем -didReceiveMemoryWarning переопределении.

Будьте осторожны, это облегчит вашу жизнь сейчас, но также приведет к сбою важного механизма, который Apple внедрила для восстановления памяти. Само по себе это не приведет к сбою, но может привести к заполнению памяти вашего устройства и внезапному закрытию вашего приложения, если вы управляете большим количеством просмотров или ваши просмотры требуют много памяти (много графики и т.д.). Итак, ваше суждение здесь…

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

1. Спасибо за ценную информацию. Конечно, это мне очень помогло. Еще раз спасибо

2. У меня есть еще один вопрос, если я удалю [super didReceiveMemoryWarning], это не приведет к сбою приложения, верно. В настоящее время, даже если я теряю значения в памяти, мое приложение не выходит из строя

3. Смотрите мои правки: я добавил рекомендации по правильному выполнению (ниже цитата Apple) и ответ на ваш последний вопрос.