/ / Czy obraz pamięci podręcznej UIImage? - Objective-C, iOS, buforowanie, uiimage

Czy obraz pamięci podręcznej UIImage Cache? - cel-c, ios, caching, uiimage

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

W drugim typie obraz zostanie zbuforowany?
Podczas gdy w pierwszym typie obrazy nie są buforowane?

Odpowiedzi:

28 dla odpowiedzi № 1
  • The -initWithContentsOfFile: tworzy nowy obraz bez buforowania, jest to zwykła metoda inicjalizacji.

  • The +imageNamed: metoda wykorzystuje pamięć podręczną. Oto dokumentacja z Dokumentacja UIImage:

    Ta metoda szuka w pamięci podręcznej systemu plikuobiekt obrazu o określonej nazwie i zwraca ten obiekt, jeśli istnieje. Jeśli pasującego obiektu obrazu nie ma jeszcze w pamięci podręcznej, ta metoda ładuje dane obrazu z określonego pliku, buforuje go, a następnie zwraca wynikowy obiekt.

    UIImage zachowa załadowany obraz, utrzymując go przy życiu, dopóki stan niskiej pamięci nie spowoduje wyczyszczenia pamięci podręcznej.

Aktualizacja dla Swift: W Swift the UIImage(named: "...") funkcja jest tą, która buforuje obraz.


9 dla odpowiedzi nr 2

Chciałem tylko zostawić to tutaj, aby pomóc w rozwiązaniu problemu z nazwami ścieżek. Jest to metoda, którą możesz zastosować UIImage Kategoria.

+(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;
}

Jeśli nie masz łatwego sposobu na przejście do pamięci podręcznej, możesz po prostu użyć `imageNamed. W większości przypadków jest to duży błąd. Zobacz ta świetna odpowiedź na więcej szczegółów (i głosuj zarówno na pytanie, jak i odpowiedź!).


1 dla odpowiedzi nr 3

@Dan Rosenstark szybko odpowiedzieć

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 dla odpowiedzi nr 4

Prawidłowo, drugi element jest buforowany.