Я пишу приложение iPad, которое использует много видео и больших последовательностей анимации PNG, заботясь о выпуске всех ресурсов, когда они больше не нужны. Инструменты не обнаруживают утечек памяти, а распределения показывают, что приложение никогда не выделяет более 30 МБ. Тем не менее, когда я смотрю на Activity Monitor, я вижу, что реальная память и виртуальная память постоянно увеличиваются, тем больше вникает в контент приложения. Я помещаю NSLogs во все мои методы dealloc, и каждый объект, который я выпускаю, освобождается. Мое приложение, однако, убивается сигналом 0. Есть ли у кого-нибудь предложения?Использование памяти iPad постоянно Увеличивает
ответ
Возможно, вы уже это делаете, но при использовании инструмента «Выделения» возьмите «кучевые снимки» при взаимодействии с пользовательским интерфейсом. Это даст вам представление о том, что выделяется в течение каждого интервала и жизненного цикла объекта. У Билла Бумгарнера есть excellent blog entry об этом мощном инструменте, который стоит прочитать.
С каждым снимком кучи инструменты показывают менее 100 КБ роста. Тем не менее мои грязные размеры, размер резидента и виртуальный размер в VM Tracker растут значительно и последовательно (примерно на 11 МБ) каждый раз, когда я меняю состояние своего приложения. Однако, как я сказал в исходном посте, каждый пользовательский объект, который я выпускаю, освобождается. – Jacob
О, я также не получаю предупреждения о низкой памяти. – Jacob
Вы работаете против симулятора или реального устройства? – rcw3
Может быть, у вас NSZombieEnabled? Случилось со мной один раз ...
NSZombieEnabled имеет значение NO. – Jacob
WWDC 2011 сеанс 318 видео «Производительность iOS в глубину» (около 43 минут 50 секунд в нем) описывает, как анимация UIImage (s) в UIImageView может использовать много памяти. Они предлагают при анимации больших изображений с использованием
- (void) animateImages
{
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(animateImage:)];
}
- (void) animateImage:(CADisplayLink *)link
{
[imageView setImage:[UIImage imageWithContentsOfFile:nextImagePath()]];
}
Скорость анимации не гарантируется. Использование + [UIImage imageWithContentsOfFile:] является ключевым, поскольку + [UIImage imageNamed:] будет кэшировать экземпляры изображений.
Я использовал эту технику в своем приложении, которая продолжала прерывать переключение памяти между наборами анимаций большого изображения, и все работает отлично и плавно на iPhone 3GS и iPhone 4S. На iPhone 3GS медленно, но 3GS даже не может сделать один набор анимаций. Глядя на статистику Dirty Size в VM Tracker, разница здесь драматична.
Проверьте с помощью приборов какие объекты все еще живут через некоторое время. – Eiko