Приложение iphone падает из-за низкого уровня памяти, но в симуляторе работает нормально - PullRequest
0 голосов
/ 26 ноября 2010

Дорогие все, у меня есть приложение на основе навигации с около 60 UIControllerViews, которое разделено на 4 раздела.

Я пробежал со следующим: 1. Построить и проанализировать: bulid успешен без нареканий. 2. Распределение приборов и утечки: нет утечек.

Тем не менее, приложение упало на iPhone или iPad, но отлично работает в симуляторе. Нет отчетов о сбоях, но я вижу LowMemory.log в папке crashreporter.

Я обновил свой iphone и ipad до 4.2

У кого-нибудь есть идеи, что может быть не так? Я читаю и устраняю неполадки в течение недели.

Есть ли необходимость удалять / освобождать UIControllerViews? Приложение вылетает, просто переключаясь между представлениями.

Спасибо за любую помощь.

Мое приложение имеет корневое представление под названием contentViewController, и пользователи могут перейти к 4 опросам отсюда.

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

- (void)goHome {
UIAlertView *alert = [[UIAlertView alloc]
                      initWithTitle: @"Warning"
                      message: @"Proceed?"
                      delegate: self
                      cancelButtonTitle:@"Yes"
                      otherButtonTitles:@"No",nil];
[alert show];
[alert release];

}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
[[self navigationController] setNavigationBarHidden:NO animated:YES];
if (buttonIndex == 0) {
    NSArray * subviews = [self.view subviews];
    [subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    self.view = nil;
    if (self.contentViewController == nil)
    {
        ContentViewController *aViewController = [[ContentViewController alloc]
                                                  initWithNibName:@"ContentViewController" bundle:[NSBundle mainBundle]];
        self.contentViewController = aViewController;
        [aViewController release];
    }
    [self.navigationController pushViewController:self.contentViewController animated:YES]; 
}
else {
}

}

Ответы [ 4 ]

3 голосов
/ 26 ноября 2010

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

1 голос
/ 26 ноября 2010

Посмотрите на консоль xcode.Если вы получаете ряд предупреждений о нехватке памяти, то вам нужно распределять и перераспределять ваши представления на лету, потому что они занимают слишком много памяти на устройстве (имитатор не так ограничен в памяти).1001 *

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

0 голосов
/ 26 ноября 2010

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

0 голосов
/ 26 ноября 2010

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

Для вашего приложения вы должны понимать, что на устройствах iOS нет места подкачки.Таким образом, вы вынуждены управлять памятью до такой степени, что вам не нужно на других платформах.Как правило, это означает, что вы не хотите часто просматривать данные в памяти, если этого можно избежать.

В случае текущего iPad приложению может быть доступно только около 110 МБ ОЗУ.Конкретные цифры, вероятно, зависят от версии iOS.В любом случае вам необходимо понять, насколько велики структуры данных (в памяти) для ваших различных представлений.Можно рассмотреть 60 различных видов в зависимости от использования памяти. Если вы не справитесь с этим правильно, вы, скорее всего, очень быстро закончите.Это не то же самое, что программирование на Java или другой язык для сбора мусора.

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

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