Лучший способ загрузки изображений из набора приложений

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

[UIImage imageNamed: "image.png"];

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myimage" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:filePath];

Ответ 4

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

NSBundle* myBundle = [NSBundle mainBundle];

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

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

NSBundle* myBundle = [NSBundle mainBundle];

NSArray* myImages = [myBundle pathsForResourcesOfType:@"jpg"
                              inDirectory:nil];