2

У меня есть приложение для iPad, в котором есть контроллер основного вида, а затем контроллер представления настроек. Когда мой основной вид представляет представление настроек, я представляю представление настроек в полноэкранном режиме. В окне настроек есть кнопка увольнения, которая работает до тех пор, пока не появится предупреждение о наличии. Если при нажатии кнопки настроек на экране появляется предупреждение о сохранении памяти, оно отказывается от увольнения.Предупреждает ли память о предупреждении контроллера представления?

Другими словами, это работает:

  • App Launch -> Show Main View -> Show Settings View -> Отклонить Настройки View

Это не:

  • App Launch -> Показать основной вид -> Показать настройки -> Память Предупреждение -> Отклонить настройки Просмотр

Вид настроек останется там.

Я запускаю это приложение на iOS 5 на iPad первого поколения. (Я не поддерживаю iOS 4.)

Как это исправить?

Edit:

Вот мой код для отображения параметров просмотра:

- (void) showSettings{ 

    if (!self.settingsViewController) { 

    //Create the navigation controller and the root view for the settings panel 
    SettingsViewController *settingsRootView = [[SettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
    UINavigationController *settingsView = [[UINavigationController alloc] initWithRootViewController:settingsRootView]; 
    [settingsRootView release]; 

    //Configure the animation and modal style, and the navigation bar's color 

    [settingsView.navigationBar setTintColor:kDarkGrayColor]; 

    //Enable the settings flag 
    [self setSettingsIsActive:YES]; 

    //Configure the presentation 
    [settingsView setModalPresentationStyle:UIModalPresentationFullScreen]; 
    [settingsView setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; 

    self.settingsViewController = settingsView; 

    [settingsView release]; 
    } 

    //present and release the settings panel 
    [self presentViewController:self.settingsViewController animated:YES completion:^{ 

    }]; 

} 

И вот как я это скрыть:

//This method reloads some stuff and 
- (void) dismissSettings{ 

    // 
    // ... Reload some other stuff... 
    // 

    //Dismiss the settings panel 
    [self dismissViewControllerAnimated:YES completion:^{ 

    // 
    // ... Reload some other stuff... 
    // 

    }]; 
} 
+0

Вы обнаружили, что дает вам предупреждение о памяти? Вы делаете что-либо в любом doReceiveMemoryWarning? – Rob

+0

@ Rob - Nope и nope. – Moshe

ответ

4

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

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

Кроме того, вы должны проверить свою реализацию методов didReceiveMemoryWarning, чтобы убедиться, что вы избавляетесь от чего-то, что может потребоваться для отклонения этого представления настроек.

В условиях низкой памяти все виды из этих неактивных контроллеров будут выгружены. Поскольку ваш метод dismissSettings объявлен на главном контроллере, когда он называется, очень возможно, что все элементы из вашего основного вида равны нулю. Я не знаю, какие операции содержатся в коде «Reload some other stuff», но я думаю, что что-то, связанное с представлением, приводит к сбою метода.

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

С другой стороны, я бы порекомендовал вам переместить реализацию метода увольнения на фактический контроллер представления настроек (помните, что это должно быть что-то вроде [ self.navigationController dismissModalViewControllerAnimated:YES];, так как вам нужно убрать навигационный контроллер). По крайней мере, так я всегда это делал и никогда не подводил меня. Логика заключается в том, что я не хочу, чтобы контроллеры неактивного представления запускали любую логику.

Наконец, как вы отмечаете, что вы ориентируетесь на iOS 5 и выше, я бы очень рекомендовал переместить ваш проект в ARC. Это проще сделать, чем кажется, и как только вы переехали, это действительно здорово.

Другой возможной причиной вашей проблемы является то, что вы вызываете метод отклонения с помощью уведомлений и что ваш основной контроллер отписывается от этих уведомлений в методе viewDidUnload. Имейте в виду, что метод viewDidUnload будет вызываться, когда срабатывает условие низкой памяти!

+0

Ничего в методах viewDidReceiveMemoryWarning, кроме вызова супервыполнения – Moshe

+0

Хорошо, и имеет ли диспетчер представлений настроек какие-либо ссылки на Main View Controller? Кроме того, поскольку, скорее всего, вид из главного контроллера просмотра освобождается, вы должны проверить, что находится внутри метода viewDidUnload, из главного контроллера представления. – flainez

+0

Нет, нет ссылки на главный контроллер. Иерархия: Главное окно -> Контроллер главного представления -> Контроллер просмотра настроек – Moshe

0

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

При этом ОС будет отключать приложения, когда память начинает замыкаться. Фоновые приложения, как правило, первыми идут, но много раз, если утечка достаточно плохая, период времени между тем, когда фоновые приложения заканчиваются, и время, когда запущенное приложение также завершено, может быть коротким.