Подтвердить что ты не робот

Изображение UIImage Cache?

UIImage *img = [[UIImage alloc] initWithContentsOfFile:@"xx.jpg"]
UIImage *img = [UIImage imageNamed:@"xx.jpg"]

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Просто хотел оставить это здесь, чтобы помочь справиться с проблемой путей. Это метод, который можно применить к категории 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. Это большая ошибка в большинстве случаев. См. этот отличный ответ для более подробной информации (и поднимите оба вопроса и ответ!).

Ответ 3

@Dan Rosenstark ответ в быстром...

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
    }
}

Ответ 4

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