Приложение загружается медленно после загрузки viewcontroller, затем выгружается примерно 15-20 раз
Использование: Xcode 4.6 Раскадровки ARC Модель перейти к SecondViewController
У меня есть приложение, которое имеет основной ViewController, который загружает новый veiwController, когда устройство поворачивается вправо. Когда приложение запускается все отлично работает. Если я поверну устройство, то обратно, которое выгружает контроллер второго вида, примерно в 15-20 раз приложение очень вяло. Я сузил, что это происходит только тогда, когда загружен контроллер второго представления и только когда я поворачиваю устройство несколько раз. Я также сузил, что это проблема памяти. Я установил приложение, которое отслеживает используемую и доступную память. Моя память уходит от 400 МБ до 900 МБ, когда я поворачиваю устройство несколько раз. Я пытаюсь дать как можно больше информации. Каждое представление имеет 8 NSTimers, которые срабатывают каждую секунду.
Есть ли способ программной выгрузки вида, чтобы убедиться, что он выгружается?
Я включил этот код для обеспечения загрузки и выгрузки:
`- (void) setView: (UIView *) aView {NSLog (@" >>> Ввод%s <<< ", PRETTY_FUNCTION);
if (!aView) // view is being set to nil
{
NSLog(@"Should be unloading now");
}
[super setView:aView];
NSLog(@"<<< Leaving %s >>>", __PRETTY_FUNCTION__);
}
результат журнала: 2013-04-22 16:42:03.588 xxxxxxxx[xxxxxxx] >>> Ввод -[GraphViewController setView:] <<< 2013-04-22 16:42:03.589 xxxxxxxx[xxxxxxx] <<< Выход - [ GraphViewController setView:] >>>
`Я не уверен, на что мне нужно смотреть, чтобы исправить это.
Любые "точки" в правильном направлении будут очень цениться.
Спасибо
1 ответ
Вы не дали много информации о том, как вы "выгружаете" SecondViewController. Вы делаете модальный переход к этому также? Если это так, то это ваша проблема - каждый раз, когда вы делаете переход, вы создаете экземпляр нового контроллера представления, и если это модальные переходы, представленный контроллер имеет сильный указатель на представляющий контроллер, поэтому ни один из этих контроллеров никогда не будет освобожден как вы идете вперед и назад.
Как правило, вы никогда не должны возвращаться назад в раскадровке, используя что-либо кроме раскручивания. Таким образом, решение вашей проблемы состоит в том, чтобы использовать переходный режим для перехода от SecondViewController обратно к MainViewController - это фактически вернется к тому же экземпляру MainViewController, с которого вы пришли, и SecondViewController будет освобожден. Если вы не знаете, как раскрутиться, я отредактирую свой ответ, чтобы показать вам, как это сделать.
После редактирования:
Чтобы расслабиться, вы делаете две вещи. В контроллере, к которому вы возвращаетесь, вы добавляете метод - две важные вещи заключаются в том, что это IBAction и что он имеет единственный аргумент, типизированный для UIStoryboardSegue*. Неважно, как вы это называете, и даже не нужно, чтобы внутри был какой-либо код, хотя я обычно вставляю оператор log просто для того, чтобы убедиться, что он вызывается. Затем в IB в контроллере, от которого вы отматываете, вы управляете перетаскиванием из вашего элемента пользовательского интерфейса, например, кнопки или ячейки табличного представления (или из самого контроллера, если вы хотите запустить его из кода), вниз к зеленому значку выхода в нижняя часть сцены - важно отметить, что вы перетаскиваете элемент UI на значок выхода в том же контроллере, а не между контроллерами. Когда вы отпустите перетаскивание над значком выхода, вы увидите все созданные вами методы с подписью, которую я упомянул выше. Выберите тот, который вы хотите, и это все. Вы можете реализовать prepareForSegue в исходном контроллере, как и любой другой segue, если вы хотите передать какую-либо информацию обратно в целевой контроллер.