Приложение работает медленно после загрузки viewcontroller, а затем выгружается примерно 15-20 раз

Использование: Xcode 4.6 Storyboards ARC Model переходит к SecondViewController

У меня есть приложение с основным ViewController, которое загружает новый veiwController, когда устройство поворачивается вправо. При запуске приложения все работает отлично. Если я поворачиваю устройство, то обратно которое выгружает контроллер secondview, примерно раз 15-20 приложение очень вяло. Я сузил, что это происходит только тогда, когда загружается второй контроллер представления, и только когда я поворачиваю устройство несколько раз. Я также сузил, что это проблема с памятью. Я установил приложение, которое отслеживает используемую и доступную память. Моя память увеличивается с 400 МБ до 900 МБ, когда я несколько раз поворачиваю устройство. Я стараюсь дать как можно больше информации. Каждое представление имеет 8 NSTimers, которые срабатывают каждую секунду.

Есть ли способ программно выгрузить представление, чтобы убедиться, что оно выгружается?

Я включил этот код для обеспечения загрузки и выгрузки:

`- (void)setView:(UIView *)aView { NSLog(@">>> Entering %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 ххххххх[ххххххх] >>> Вход -[GraphViewController setView:] ‹‹‹ 2013-04-22 16:42:03.589 хххххххх[ххххххх] ‹‹‹ Выход -[ GraphViewController setView:] >>>

` Я не уверен, что мне нужно посмотреть, чтобы исправить это.

Любые «точки» в правильном направлении будут очень оценены.

Спасибо


person Eric    schedule 22.04.2013    source источник


Ответы (1)


Вы не дали много информации о том, как вы «выгружаете» SecondViewController. Вы также делаете модальный переход к нему? Если это так, это ваша проблема - каждый раз, когда вы выполняете переход, вы создаете экземпляр нового контроллера представления, и если это модальные переходы, представленный контроллер имеет сильный указатель на представляющий контроллер, поэтому ни один из этих контроллеров никогда не будет освобожден. как вы идете вперед и назад.

Как правило, вы никогда не должны возвращаться назад в раскадровке, используя что-либо, кроме переходного периода. Итак, решение вашей проблемы состоит в том, чтобы использовать откат для перехода от SecondViewController обратно к MainViewController — это фактически вернется к тому же экземпляру MainViewController, из которого вы пришли, и SecondViewController будет освобожден. Если вы не знаете, как раскрутить переход, я отредактирую свой ответ, чтобы показать вам, как это сделать.

После редактирования:

Чтобы раскрутить переходы, нужно сделать две вещи. В контроллере, к которому вы вернетесь, вы добавляете метод — две важные вещи: это должен быть IBAction и иметь единственный аргумент, типизированный для UIStoryboardSegue*. Неважно, как вы его назовете, и ему даже не нужно иметь какой-либо код внутри, хотя я обычно добавляю оператор журнала, чтобы убедиться, что он вызывается. Затем в IB в контроллере, от которого вы отматываетесь, вы управляете перетаскиванием из своего элемента пользовательского интерфейса, такого как кнопка или ячейка представления таблицы (или из самого контроллера, если вы хотите запустить его из кода), до зеленого значка «Выход» в внизу сцены — важно отметить, что вы перетаскиваете элемент пользовательского интерфейса к значку выхода в одном и том же контроллере, а не между контроллерами. Когда вы отпустите перетаскивание значка выхода, вы увидите все созданные вами методы с подписью, упомянутой выше. Выберите тот, который вы хотите, и все. Вы можете реализовать prepareForSegue в исходном контроллере, как и любой другой переход, если хотите передать какую-либо информацию обратно в целевой контроллер.

person rdelmar    schedule 23.04.2013
comment
Спасибо за ценную информацию. Я не знал этого о движении назад. У меня нет опыта раскрутки. Если у вас есть образец, было бы здорово. Еще раз спасибо!! - person Eric; 23.04.2013
comment
У меня нет элемента пользовательского интерфейса, который используется для загрузки/загрузки второго контроллера представления. Я использую код ниже. - person Eric; 24.04.2013
comment
@ Эрик, тогда, как я уже сказал, вы перетаскиваете от самого контроллера (его значок на нижней панели) к значку выхода. В этом случае вам нужно дать переходу идентификатор, чтобы вы могли использовать его в коде. - person rdelmar; 24.04.2013
comment
Извини, я думал, что сделал. Спасибо еще раз. - person Eric; 26.04.2013