UIImage *img = [[UIImage alloc] initWithContentsOfFile:@"xx.jpg"]
UIImage *img = [UIImage imageNamed:@"xx.jpg"]
Во втором типе изображение будет кэшироваться?
В то время как в первом типе изображения не кэшируются?
UIImage *img = [[UIImage alloc] initWithContentsOfFile:@"xx.jpg"]
UIImage *img = [UIImage imageNamed:@"xx.jpg"]
Во втором типе изображение будет кэшироваться?
В то время как в первом типе изображения не кэшируются?
-initWithContentsOfFile:
создает новое изображение без кэширования, это обычный метод инициализации.
В методе +imageNamed:
используется кеш. Вот документация из UIImage Reference:
Этот метод просматривает системные кэши для объекта изображения с указанным именем и возвращает этот объект, если он существует. Если соответствующий объект изображения еще не находится в кеше, этот метод загружает данные изображения из указанного файла, кэширует его и затем возвращает результирующий объект.
UIImage сохранит загруженное изображение, сохранив его до тех пор, пока условие низкой памяти не приведет к очистке кеша.
Обновление для Swift:
В Swift функция UIImage(named: "...")
- это та, которая кэширует изображение.
Просто хотел оставить это здесь, чтобы помочь справиться с проблемой путей. Это метод, который можно применить к категории 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. Это большая ошибка в большинстве случаев. См. этот отличный ответ для более подробной информации (и поднимите оба вопроса и ответ!).
@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
}
}
Правильно, второй элемент кэшируется.