Лучший способ загрузки изображений из комплекта приложений - PullRequest
16 голосов
/ 07 февраля 2012

Каков наилучший способ загрузки изображений из основного пакета приложения.Я использую

[UIImage imageNamed: "image.png"];

Но я слышал, что это не очень хорошо с точки зрения использования памяти и производительности.Кто-нибудь может дать свой отзыв об этом?Мое приложение читает много изображений из основного пакета во время запуска.Я хочу сделать этот процесс максимально эффективным.

С наилучшими пожеланиями

Ответы [ 4 ]

13 голосов
/ 07 февраля 2012

Если бы существовал один истинный «Лучший способ», средства для загрузки изображений несколькими способами не существовали бы (если только по историческим причинам).Поэтому, немного понимания поможет вам лучше, чем перевести ответ на «Best Way».

+[UIImage imageNamed:] кэширует изображение для повторного использования, и это разумное значение по умолчанию для большинства целей.Кэширование отлично , если используется правильно.Кеш хорош, потому что он может минимизировать чтение с вашего диска и использование памяти за счет совместного использования и повторного использования загруженных изображений, а не чтения и выделения копии для каждого изображения, которое вы должны отобразить.Рассмотрим изображение значка, которое вы используете на нескольких экранах - хотели бы вы, чтобы данные изображения считывались и перераспределялись каждый раз?Это может привести к избыточному чтению и распределению идентичных данных изображения.Если нет, используйте методы кэширования.

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

  • Данные изображения могут потреблять многопамять.
  • Чтение образа может занять много времени - не только дисковый ввод-вывод, но и преобразование его в используемое представление UIImage (например, распаковка изображения).
  • также существуютвремя, когда вы должны изменить размер / масштабировать изображение.тогда вам понадобится масштабированная копия.

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

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

10 голосов
/ 19 сентября 2013
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myimage" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:filePath];
7 голосов
/ 07 февраля 2012

Если вы хотите попробовать загрузить изображения без кэширования, вы можете использовать:

[[UIImage alloc] initWithContentsOfFile:@"image.png"]; 

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

0 голосов
/ 07 февраля 2012

Для поиска одного файла ресурсов с помощью NSBundle

NSBundle* myBundle = [NSBundle mainBundle];

NSString* myImage = [myBundle pathForResource:@"Seagull" ofType:@"jpg"];

и для поиска нескольких ресурсов:

NSBundle* myBundle = [NSBundle mainBundle];

NSArray* myImages = [myBundle pathsForResourcesOfType:@"jpg"
                              inDirectory:nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...