Утечки памяти по сравнению с высоким распределением памяти? - PullRequest
2 голосов
/ 03 февраля 2011

В моем приложении для iPhone у меня есть очень длинная таблица, которую я загружаю из xml (онлайн-xml).В этой таблице показано одно изображение и несколько текстовых данных подряд.Я также использую Lazy Loading для загрузки изображения.Теперь в инструментах нет серьезных утечек, но общее выделение памяти увеличивается, когда я прокручиваю таблицу вниз (означает загрузку новых изображений).

Я хочу знать, приведет ли это к сбою приложения?Мой клиент говорит, что приложение падает на 3GS и iPhone 4, я тестирую приложение на iPod 4G.Я не вижу никаких сбоев, но я вижу большие выделения памяти в приборах.

Пожалуйста, помогите!

update -

Да, я использую ResuableКлетки.Когда изображение загружается, я добавляю их в ячейки, используя этот код -

- (void)appImageDidLoad:(NSIndexPath *)indexPath
{

IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath];
        if (iconDownloader != nil)
        {
            UITableViewCell *cell = (UITableViewCell *)[tblView cellForRowAtIndexPath:iconDownloader.indexPathInTableView];

            // Display the newly loaded image
            UIImageView *mixtapeImage =  (UIImageView *) [cell viewWithTag:TAG_IMAGE];
            mixtapeImage.image = iconDownloader.appRecord.mixtape_image_obj;

        }

}

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

Есть ли более эффективный способ сделать это?

Ответы [ 5 ]

2 голосов
/ 03 февраля 2011

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

2 голосов
/ 03 февраля 2011

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

Что касается диагностики, попробуйте инструменты "Распределения", чтобы увидеть, есть ли у вас больше живых объектов какого-либо типа (скажем, UIImages), чем вы ожидаете. Вот как бы вы это сделали:

В инструменте Allocations, используя в правом верхнем окне поиска, поиск "Образ". Тогда ищи колонку помечены #linving в UIImage. Тот число является номером UIImage объекты. Это лучший компас в чтобы выяснить, где ваш UIImages собирается. Если в какой-то момент вы иметь больше объектов, чем вы ожидать, и theImage UI не уходя у вас есть утечка UIImage в ваши руки. Утечка UIImage убьет ваше приложение очень быстро.

цитата из этого ответа.

2 голосов
/ 03 февраля 2011

Вы отвечаете на предупреждения памяти?Если вы это сделаете, и вы делаете это правильно, ваше приложение не будет падать.Однако, если вы просто прокручиваете табличное представление, и память накапливается (продолжает ли она расти и насколько?), Значит что-то не так.Это может быть что-то столь же простое, как пул автоматического выпуска, который неуместен (вы загружаете изображение), но вполне может быть более серьезным.

Не видеть сбоев на одном устройстве не означает, что он не будетсбой на устройствах с другим состоянием (т. е. состоянием нехватки памяти).

Вы можете обновить свой пост скриншотом инструментов, возможно, списком объектов и т. д.

1 голос
/ 03 февраля 2011

Как выглядит ваш метод cellForRowAtIndexPath? Вы действительно автоматически высвобождаете ячейку, которую вы там разместили?

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

Версии iOS до 4.0 имеют более низкие пределы для выделения памяти. Вот почему приложение падает на iPhone вашего клиента, но не на вашем.

1 голос
/ 03 февраля 2011

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

Вы уже запустили инструменты, благодаря которым вы попали в топ 1% разработчиков приложений для iOS за знание того, как ваше приложение ведет себя на устройстве. Отлично сработано! Следующий шаг - понять, почему вы монотонно увеличиваете использование памяти при прокрутке таблицы. Итак, вы лениво загружаете изображения, когда они нужны, но вы избавляетесь от них снова, когда они не нужны? Это должно быть легко сделать, используя UITableView с многоразовыми ячейками, но, возможно, вы где-то кэшируете изображения и никогда не очищаете кеш. Что происходит в приборах, когда вы отправляете предупреждение о нехватке памяти в симуляторе?

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