Имеет ли UIImage Cache образ? - PullRequest
       17

Имеет ли UIImage Cache образ?

20 голосов
/ 27 декабря 2011
UIImage *img = [[UIImage alloc] initWithContentsOfFile:@"xx.jpg"]
UIImage *img = [UIImage imageNamed:@"xx.jpg"]

Во втором типе изображение будет кэшироваться?
В то время как в первом типе изображения не кэшируются?

Ответы [ 4 ]

29 голосов
/ 27 декабря 2011
  • -initWithContentsOfFile: создает новое изображение без кэширования, это обычный метод инициализации.

  • Метод +imageNamed: использует кэш. Вот документация из UIImage Reference :

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

    UIImage сохранит загруженное изображение, сохраняя его в активном состоянии до тех пор, пока из-за нехватки памяти кэш очистится.

Обновление для Swift: В Swift функция UIImage(named: "...") кэширует изображение.

9 голосов
/ 25 декабря 2012

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

+(UIImage *)imageNamed:(NSString *)name cache:(BOOL)cache {
    if (cache)
        return [UIImage imageNamed:name];
    name = [[NSBundle mainBundle] pathForResource:[name stringByDeletingPathExtension] ofType:[name pathExtension]]; 
    UIImage *retVal = [[UIImage  alloc] initWithContentsOfFile:name];
    return retVal;
}

Если у вас нет простого способа переключиться на кеширование, вы можете в конечном итоге просто использовать `imageNamed. Это большая ошибка в большинстве случаев. См. этот отличный ответ для более подробной информации (и поднимите вопрос и ответ!).

1 голос
/ 18 сентября 2016

@ Дэн Розенстарк ответ в кратчайшие сроки ..

extension UIImage {

    static func imageNamed(name: String, cache: Bool) -> UIImage? {
        if (cache) {
            return UIImage(named: name)
        }

        // Using NSString for stringByDeletingPathExtension
        let fullName = NSString(string: name)
        let fileName = fullName.stringByDeletingPathExtension
        let ext = fullName.pathExtension
        let resourcePath = NSBundle.mainBundle().pathForResource(fileName, ofType: ext)

        if let path = resourcePath {
            return UIImage(contentsOfFile: path)
        }
        return nil
    }
}
0 голосов
/ 27 декабря 2011

Правильно, второй элемент кэшируется.

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