Подтвердить что ты не робот

Почему ARC не освобождает память после popViewController

Я запускаю и просматриваю ViewControllers в UINavigationController.

Я отслеживаю потребление памяти в моем приложении. При нажатии нового диспетчера просмотров потребление памяти постепенно увеличивается, но когда я выхожу на тот же ViewController, используя [self.navigationController popViewControllerAnimated:NO];, потребление памяти не уменьшается, а константа.

Этот особый viewController может быть многократно вытолкнут и вытолкнут пользователем, что может привести к высокому потреблению памяти приложения в ОЗУ.

Что мне делать для оптимизации потребления памяти?

4b9b3361

Ответ 1

Когда вы отклоняете контроллер представления (или выталкиваете его), он будет освобожден, если вы не сделаете никаких сильных указателей на него (этот контроллер будет сохранен контроллером навигации или контроллером представления представления, поэтому вы обычно делаете Не нужно иметь указатель на него, когда вы его создаете, и нажимаете или представляете его).

Он будет выпущен, если нет других сильных указателей на него

Ответ 2

Старайтесь не использовать сильные свойства для IBOutlets.

Ответ 3

Рассмотрим вопрос о том, ссылаетесь ли вы на self в блоке. Если вы это сделаете, вы рискуете удержаться на ссылке UIViewController после того, как вы ее вытащили.

Для более глубокого анализа причин, проверьте этот ответ: Как избежать захвата себя в блоках при реализации API?

Ответ 4

Если ваш дизайн приложения позволяет пользователю снова и снова выталкивать один и тот же контроллер представлений, вам может потребоваться повторное использование одного и того же контроллера представлений и просто обновление его содержимого при каждом нажатии.

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

Ответ 5

Я хотел бы сказать, что мои последние несколько дней были потрачены на поиск в Интернете проблемы с моей памятью приложения. Я переключался между 2 UIViewControllers. У одного из них был вид прокрутки, который содержал все подзаголовки на нем. Оказалось, что этот UIVC загружает новое представление прокрутки, не отпуская предыдущее. Мне потребовалось несколько часов, чтобы понять это.

Что я сделал:

Ищите какие-то взаимоблокировки внутри приложения, а затем ищите каждую переменную, у которой были сильные атрибуты и другие отчаянные меры. Но что действительно сработало:

 @IBAction func backBB(sender: UIBarButtonItem) {
    collectionView.removeFromSuperview()
    self.frontView.removeFromSuperview()
    eventsPhotos.removeAll(keepCapacity: false)
    symbolContainerView.removeFromSuperview()
    self.myScrollView.removeFromSuperview()
    dismissViewControllerAnimated(true, completion: {})
}

Я вручную удалил некоторые виды и содержимое. Я сделал это в кнопке "Назад", но вы можете сделать это в других методах, таких как viewWillDisappear (анимированный: Bool).

Как только я это сделал, моя диаграмма распределения в инструментах разработчика показала распределение памяти вверх и вниз... И это было решено...

Ответ 6

Я думаю, что вы получаете сообщение об ошибке, когда пытаетесь выставить контроллер вида, потому что контроллер навигации не имеет правильной ссылки на контроллер вида, поскольку он был выпущен после того, как вы его нажали.

Ответ 7

Ничего не найдено.

[menuPopup_ dismissPopoverAnimated:YES];
menuPopup_ = nil;