Память [Real RAM], используемая приложением на IPhone 4.0, а затем с помощью UIImageview - PullRequest
0 голосов
/ 24 августа 2010

У меня два запроса

  1. Я запустил пример приложения, в котором реализован единственный контроллер представления. Когда я проверял память с помощью прибора, он показывал 3,66 МБ , Удивился, почему он занимает столько памяти, сколько в приложении ничего особенного.

  2. Когда я добавил UIImageview с изображением, имеющим размер 25 КБ , тогда использование памяти переходит на 4,24 МБ
    [Я узнал, что причина в том, что «изображение распаковано 320 * 480 * 4 = 580 КБ », но мне нужно больше отладки, и оно остается в кэше]

Наряду с этим я также наблюдал два сценария

  1. Когда мы используем api [UIImage imageNamed:aName] для загрузки изображения, то вызов [UIImageview release] не имеет никакого эффекта.

  2. Но когда мы используем

[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:aName ofType:nil]];

Некоторая память очищается, когда я звоню [UIImageview release]

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

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

Спасибо

Сагар

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

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

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

Многие люди, кажется, чувствуют себя плохо из-за того, что их приложение генерирует предупреждения памяти. Это глупо. Шаблон дизайна - ешьте сколько хотите, но отвечайте соответствующим образом, когда вам говорят, что у вас избыточный вес. Учитывая, что вы работаете с широким спектром устройств с широким диапазоном профилей памяти (например, iPhone 3G имеет 1/4 ОЗУ от iPhone 4), лучший способ - просто быть чувствительным к тому моменту, когда вы заполнили память.

Основным препятствием, с которым вы столкнетесь, будет восстановление после сброса данных. Я считаю, что лучше всего явно установить объекты UIImage на nil, а затем проверить их на nil перед их использованием, перезагрузить их из комплекта или сети или любого другого, если это необходимо.

Все это говорит: [UIImage imageNamed:] поддерживает канаву, но вы не можете ее контролировать. Когда подкласс UIViewController получает предупреждение о памяти, он откажется от кэшированных UIImages, которые вы создали с помощью этого метода, но ничего, что вы можете сделать, не заставит их исчезнуть до тех пор. Даже назначение чего-то крошечного для рассматриваемого UIImage не поможет, потому что оно кэшируется, связанное с «именем», которому оно «Именовано», а не с объектом, которому оно назначено. Так что этот метод хорош для изображений, которые вы собираетесь многократно использовать, но даже в этом случае он будет сокращен, когда придет время, и вам нужно будет ответить соответствующим образом.

0 голосов
/ 24 августа 2010

Изображения, загруженные с помощью imageNamed, кэшируются в памяти UIKit, а изображения, загруженные с помощью imageWithContentsOfFile, не являются.

...