Переходы раскадровки вызывают утечки памяти

У меня есть два UIViewControllers с кнопками, запускающими переход (модальный) друг к другу. Я хотел выяснить, вызывает ли это какие-либо утечки памяти при переходе назад и вперед, и я вижу, что выделенная память Living Object && увеличивается, что в конечном итоге приведет к сбою приложения. У меня нет ни одной строчки кода — работа с чистыми UIViewControllers. раскадровка

профилировщик 1

profiler 2настройки проекта

Что я могу делать неправильно?
Может я что-то не так выставил в настройках проекта?
Я плохо читаю статистику профилировщика?
Нужно ли мне делать какие-то специальные команды выпуска при работе с переходами?


person Piotr    schedule 28.10.2012    source источник


Ответы (1)


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

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

1) определить метод, такой как viewController2Done, в контроллере представления 1
2) в контроллере представления 2 создать свойство с именем delegate типа id.
3) в prepareToSegue для контроллера представления 1 установить delegate в контроллере представления 2 на self
4) в контроллере представления 2, когда пришло время вернуться к контроллеру представления 1, вызовите [delegate viewController2Done]
5) в viewController2Done вызовите [self dismissModalViewControllerAnimated:YES]

Этот метод по-прежнему работает в iOS 6, но вместо него можно использовать новый unwind segue. Чтобы использовать его, вы должны определить метод в своем контроллере представления 1 следующим образом:

Цель-C:

- (IBAction)unwindFromViewController2:(UIStoryboardSegue *)segue
{
    NSLog(@"and we are back");
}

Свифт:

@IBAction func unwindFromViewController2(_ segue: UIStoryboardSegue) {
    print("and we are back")
}

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

введите здесь описание изображения

person vacawama    schedule 28.10.2012