UIImage *img = [[UIImage alloc] initWithContentsOfFile:@"xx.jpg"]
UIImage *img = [UIImage imageNamed:@"xx.jpg"]
Nel secondo tipo l'immagine verrà memorizzata nella cache?
Mentre nel primo tipo le immagini non vengono memorizzate nella cache?
risposte:
28 per risposta № 1Il
-initWithContentsOfFile:
crea una nuova immagine senza cache, è un normale metodo di inizializzazione.Il
+imageNamed:
il metodo utilizza la cache. Ecco una documentazione da Riferimento UII:Questo metodo cerca nelle cache di sistema per unoggetto immagine con il nome specificato e restituisce quell'oggetto se esiste. Se un oggetto immagine corrispondente non è già presente nella cache, questo metodo carica i dati dell'immagine dal file specificato, li memorizza nella cache e quindi restituisce l'oggetto risultante.
UIImage manterrà l'immagine caricata, mantenendola in vita fino a quando la condizione di memoria insufficiente causerà l'eliminazione della cache.
Aggiornamento per Swift:
In Swift il UIImage(named: "...")
la funzione è quella che memorizza l'immagine nella cache.
9 per risposta № 2
Volevo solo lasciarlo qui per aiutarti a risolvere il problema dei nomi dei percorsi. Questo è un metodo che puoi mettere su UIImage
categoria.
+(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;
}
Se non si ha un modo semplice per passare alla cache, si potrebbe finire con l'uso di `imageNamed. Questo è un grosso errore nella maggior parte dei casi. questa grande risposta per maggiori dettagli (e alzare sia le domande che le risposte!).
1 per risposta № 3
@Dan Rosenstark rispondi in fretta ..
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 per risposta № 4
Corretto, il secondo elemento viene memorizzato nella cache.