как освободить память, объект, viewcontroller, когда вы открываете root ViewController

Я работаю с переходом контроллера навигации, который содержит около 5 ViewController. Каждому ViewController предшествует другой, например установочное приложение. Последний ViewController содержит кнопку, которая заставляет вас вернуться к первому ViewController через это предложение:

[self.navigationController popToRootViewControllerAnimated:YES];

Мои вопросы заключаются в том, как я могу освободить все объекты, ViewController, память, которую я хранил во время первого выполнения приложения, и когда я нажимаю кнопку, чтобы вернуться к первому ViewController, получить среду как первое выполнение.

Есть идеи? Спасибо!


person rubrin    schedule 13.03.2013    source источник
comment
Что вы имеете в виду под тем, что я сохранял во время первого выполнения приложения? Вы держите сильный указатель на любой из этих контроллеров? Когда вы используете popToRootViewController, все остальные контроллеры должны быть освобождены, если вы не сохраняете на них надежный указатель.   -  person rdelmar    schedule 13.03.2013
comment
Я ничего не сохраняю в качестве сильного указателя (только nonatomic). Чтобы пояснить вас, один пример: в одном ViewController у меня есть компас, который использует объект LocationManager. Этот объект остается активным и обновляется, даже когда я вызываю метод pop...   -  person rubrin    schedule 13.03.2013
comment
Откуда вы знаете, что он все еще активен, если контроллер, в котором он использовался, теперь освобожден?   -  person rdelmar    schedule 13.03.2013
comment
Потому что у меня есть NSLog, который каждую секунду показывает мне значения, которые LocationManager содержит для каждого обновления.   -  person rubrin    schedule 13.03.2013
comment
Вам придется объяснить это дальше. Где этот журнал? Это в контроллере корневого представления? Вы создали диспетчер местоположения в одном из контроллеров, которые выскочили из стека?   -  person rdelmar    schedule 13.03.2013
comment
В структуре моего приложения есть пять таких UIViewController -> UINavCon - UIVC 1 - UIVC 2 - UIVC 3 - UIVC 4 - UIVC 5. Когда вы получаете UIVC 5, приложение завершает работу и, нажав кнопку, перенаправляет вас на первый UIVC (UIVC 1) Точно, в UIVC 3 я реализовал компас с привязкой к LocationManager. Что я делаю, так это инициализирую метод обновления с помощью [locationManager startUpdatingHeading] и внутри метода обратного вызова -(void)locationManager:(CLLocationManager *) manager didUpdateHeading:(CLHeading *)newHeading я установил NSLog   -  person rubrin    schedule 13.03.2013
comment
Я не понимаю, как это возможно. Я пробовал это, и как только я возвращаюсь к root, все контроллеры, кроме root, освобождаются, и мои сообщения в журнале прекращаются. Попробуйте добавить метод Dealloc в UIVC2, 3 и 4 и просто поместите в них журнал для регистрации себя. Посмотрите, вызываются ли они, когда вы возвращаетесь к root.   -  person rdelmar    schedule 13.03.2013
comment
Я не могу использовать метод Dealloc, потому что я использую ARC (автоматический подсчет ссылок)... может ли это быть причиной моей проблемы?   -  person rubrin    schedule 13.03.2013
comment
Вы можете использовать Dealloc с ARC, просто обычно вам это не нужно, и вы не хотите вызывать в нем super Dealloc. Это не причина вашей проблемы   -  person rdelmar    schedule 13.03.2013
comment
Я сделал то, что вы мне предложили, и этот метод не вызывается, когда я возвращаюсь к root...   -  person rubrin    schedule 13.03.2013
comment
Итак, у вас должны быть где-то указатели на эти контроллеры. Какую строку кода вы используете, чтобы вернуться к руту?   -  person rdelmar    schedule 13.03.2013
comment
-(IBAction)endApplication:(id)sender{ [self.navigationController popToRootViewControllerAnimated:YES]; } Я перемещаюсь по каждому контроллеру с помощью push segue...   -  person rubrin    schedule 13.03.2013
comment
Ok. Хорошо. Как вы переходите с VC1 на VC2? Вы вводите код (если да, то какой) или просто используете переходы, настроенные в IB?   -  person rdelmar    schedule 13.03.2013
comment
Я настроил все переходы в IB, но в последнем случае я не устанавливал никаких переходов (обратно), потому что я делаю это с этим кодом.   -  person rubrin    schedule 13.03.2013
comment
Вы не выполняете настройку контроллеров в делегате приложения, не так ли? Я не думаю, что смогу помочь, не видя вашего кода. Где-то должны быть ссылки на эти контроллеры, иначе они будут освобождены. Я просто понятия не имею, где это может быть.   -  person rdelmar    schedule 13.03.2013
comment
Я установил пару контроллеров делегатов для управления таблицами, LocationManager... Хорошо, большое спасибо за вашу помощь. Я постараюсь выяснить любое другое решение   -  person rubrin    schedule 13.03.2013
comment
Ok. Я предполагаю, что эти контроллеры содержат указатели на контроллеры, которые вы извлекаете из стека, поэтому вам нужно как-то их обнулить.   -  person rdelmar    schedule 13.03.2013
comment
Я отлаживал свое приложение и обнаружил элементы, которые удерживали мои контроллеры. Первым элементом был CMMotionManager, а вторым — NSTimer. Теперь все мои контроллеры освобождаются, когда я возвращаюсь. Спасибо за вашу помощь снова.   -  person rubrin    schedule 14.03.2013


Ответы (1)


Этот метод извлекает из стека все контроллеры представления, кроме корневого контроллера представления.

person arun.s    schedule 13.03.2013
comment
В моем случае я использую такой поток: [self PerformSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO] и после всплывающего метода он все еще работает... есть идеи, почему он все еще работает? - person rubrin; 13.03.2013
comment
Даже я использую ссылку CLLocationManager, которая все еще работает... поэтому я думаю, что мне нужно что-то дополнительное, чтобы освободить эти объекты.... - person rubrin; 13.03.2013