2014-01-10 4 views
1

У меня есть простое приложение, состоящее из меню боковой панели (я использую SWRevealViewController), который содержит табличный вид, каждая ячейка которого имеет сегмент, указывающий на UIWebViewController. Таким образом, пользователь может открыть боковую панель и переключиться между различными настроенными мобильными сайтами (между прочим).Как очистить экземпляры UIViewController, созданные Storyboard Segues?

У меня это нормально работает, но я заметил, что, когда я переключаюсь между вкладками боковой панели, количество контроллеров, которые пингируют во время предупреждения о памяти, продолжает расти. Похоже, что новый UIWebVewController создается каждый раз, когда я переключаю вкладки, что прекрасно, за исключением того, что код структуры, по-видимому, хранит список каждого созданного контроллера и никогда не отпускает его, в результате чего память продолжает подниматься. Я уверен, что есть способ, что я могу очистить этот список, но я не нашел еще ...

Итак, мои вопросы

  1. Что это такое, что держит на ссылки на каждый Созданный UIViewController, и где я могу найти/получить доступ к этому?
  2. Как его очистить?
  3. Какой код оболочки/класс отвечает за вызов didReceiveMemoryWarning:, и где этот парень получает список контроллеров, которым необходимо получить предупреждение?

В поисках вокруг, я наткнулся на this StackOverflow question, который намекает, что popViewControllerAnimated: может быть, как я могу очистки ненужных контроллеров, но я не уверен, какой объект следует называть, что, так как я не знаю, ответ на # 1 или # 3 выше ...

ответ

1

Оказалось, что в моем случае предмет, содержащий ссылку на мои контроллеры (вопрос № 1), был запланированным NSTimer, который создавал контроллер с сам в качестве цели. Чтобы очистить его (вопрос № 2), мне нужно было аннулировать таймер до выхода из контроллера (в моем случае, в методе viewWillDisappear:) через [myTimer invalidate].

Я до сих пор не нашел ответ на вопрос № 3, и мне все еще интересно узнать, как Apple отслеживает, какие контроллеры все еще живы и, следовательно, необходимо предупреждение о памяти, но вопрос № 3 isn ' как важнее для меня, теперь, когда моя утечка памяти исчезла. :)

0

Проверьте, находится ли SWRevealViewController на контроллере просмотра, он нажимает на стек. Обычно вы создаете словарь UINavigationControllers каждый для вашего ViewController, а затем используйте словарь для извлечения UINavigationControllers каждый раз, когда вам это нужно.

+1

Спасибо за ответ. SWRevealViewController может держаться за контроллеры, но даже если это так, это не ТОЛЬКО место, где хранятся ссылки. Код Apple - это то, что вызывает didReceiveMemoryWarning: поэтому код Apple должен * также * содержать ссылки (либо это, либо Apple вызывает метод делегата, чтобы найти эту информацию. Если да, то каков этот метод?). Это те ссылки, которые мне нужно очистить. Если Apple держит их навсегда, то это утечка памяти. Должен быть способ сказать код Apple, что контроллер больше не нужен, чтобы Apple могла отказаться от ссылки. – Troy

Смежные вопросы