Память iPhone не освобождается после просмотра и выгрузки, почему? - PullRequest
1 голос
/ 20 октября 2011

Я боролся с проблемами памяти в своем приложении для iphone уже несколько недель и пока не смог решить эту проблему, несмотря на всесторонние исследования в Интернете.

Вот случай: мое приложение связывается сGoogle Analytics API и основан на 3 основных представлениях: основном представлении, представлении настройки и представлении таблицы, в котором представлены данные из Google (с пользовательской ячейкой).Я также создал собственный класс, который выбирает данные из Google, а затем убивает себя, когда закончил.Все данные хранятся в едином центре обработки данных.

Все представления инициируются, а затем освобождаются следующим образом:

if (self.vVisitsTabelView == nil) {
    visitsTabelView *initiatevisitsTabelView = [[visitsTabelView alloc]     initWithNibName:@"visitsTabelView" bundle:nil];
    self.vVisitsTabelView = initiatevisitsTabelView;
    [initiatevisitsTabelView release];
}

[self.navigationController  pushViewController:vVisitsTabelView animated:YES];
[vVisitsTabelView release];
vVisitsTabelView = nil;

Проблема заключается в том, что при каждой загрузке памяти представления увеличивается, но когда представление выталкивается, оно не освобождает память, хотявызывается dealloc и освобождаются ВСЕ переменные экземпляра.Этот цикл повторяется снова (при повторной загрузке того же представления), и потребление памяти становится очень высоким.После требовательного использования я даже получил 200 Мб реальной памяти и 320 виртуальных на инструментах.Как ни странно, предупреждение о памяти было получено только один раз, однако мое приложение никогда не падало из-за нехватки памяти, и инструменты не показывают утечек.

После входа в фоновый режим память медленно освобождается и используется другими приложениями, однако, когда я возвращаюсь кпамять переднего плана возвращается на уровень перед входом в фон (возможно, из виртуальной памяти?).Этот процесс занимает 9 секунд, и за это время приложение зависает.

Есть идеи, как атаковать эту ситуацию?Я искал повсюду и тщательно следовал всем указаниям.

Любое руководство высоко ценится ...

Пожалуйста, извините, если я не следовал указаниям, я впервые в этом замечательном месте.

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

Спасибо, не могли бы вы подробнее рассказать, как это сделать?

Да; у вас утечка памяти Теперь инструмент утечки может или не может сказать вам, что происходит утечка. Он не обнаружит объекты, которые все еще как-то связаны с остальной частью приложения; то есть, если ссылка на объект сохраняется в NSMutableDictionary где-то, что все еще используется приложением, она не будет обнаружена.

Поскольку вы точно знаете, какой объект протекает, нужно выяснить, что его удержало, а не освободить. Инструмент Allocations обеспечивает именно эту возможность. В частности, вы можете сконфигурировать инструмент Allocations для отслеживания количества оставшихся записей.

Эта статья может помочь http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/.

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

0 голосов
/ 20 октября 2011

Вы проверили счет сохранения ваших просмотров?[theView retainCount] сделает это.

В любом случае, вам настоятельно рекомендуется перейти на ARC, который является новым для iOS5.Вы должны быть в состоянии попрощаться со всеми своими проблемами управления памятью.

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