Разве предупреждение памяти разрушает контроллер представления? - PullRequest
2 голосов
/ 27 января 2012

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

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

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

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

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

Как я могу это исправить?

Редактировать:

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

- (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...
    //

    }]; 
}

Ответы [ 2 ]

4 голосов
/ 27 января 2012

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

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

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

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

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

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

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

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

0 голосов
/ 27 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...