¿Por qué este código descomprime un UIImage mucho mejor que el enfoque ingenuo?

En mi aplicación necesito cargar imágenes JPEG grandes y mostrarlas en una vista de desplazamiento. Para mantener la interfaz de usuario receptiva, decidí cargar las imágenes en segundo plano y luego mostrarlas en el hilo principal. Para cargarlos completamente en el fondo, fuerzo a que se descomprima cada imagen. yoestaba usar este código para descomprimir una imagen (tenga en cuenta que mi aplicación es solo para iOS 7, por lo que entiendo que usar estos métodos en un hilo de fondo es correcto):

+ (UIImage *)decompressedImageFromImage:(UIImage *)image {
    UIGraphicsBeginImageContextWithOptions(image.size, YES, 0);
    [image drawAtPoint:CGPointZero];
    UIImage *decompressedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return decompressedImage;
}

Sin embargo, todavía tenía largos tiempos de carga, tartamudeo de interfaz de usuario y mucha presión de memoria. Acabo de encontrarotra solución:

+ (UIImage *)decodedImageWithImage:(UIImage *)image {
    CGImageRef imageRef = image.CGImage;
    // System only supports RGB, set explicitly and prevent context error
    // if the downloaded image is not the supported format
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGContextRef context = CGBitmapContextCreate(NULL,
                                                 CGImageGetWidth(imageRef),
                                                 CGImageGetHeight(imageRef),
                                                 8,
                                                 // width * 4 will be enough because are in ARGB format, don't read from the image
                                                 CGImageGetWidth(imageRef) * 4,
                                                 colorSpace,
                                                 // kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little
                                                 // makes system don't need to do extra conversion when displayed.
                                                 kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little);
    CGColorSpaceRelease(colorSpace);

    if ( ! context) {
        return nil;
    }
    CGRect rect = (CGRect){CGPointZero, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)};
    CGContextDrawImage(context, rect, imageRef);
    CGImageRef decompressedImageRef = CGBitmapContextCreateImage(context);
    CGContextRelease(context);
    UIImage *decompressedImage = [[UIImage alloc] initWithCGImage:decompressedImageRef];
    CGImageRelease(decompressedImageRef);
    return decompressedImage;
}

Este código es órdenes de magnitud mejor. La imagen se carga casi de inmediato, no hay ningún tartamudeo de la interfaz de usuario y el uso de la memoria se ha reducido.

Así que mi pregunta es doble:

¿Por qué el segundo método es mucho mejor que el primero?Si el segundo método es mejor debido a los parámetros únicos del dispositivo, ¿hay alguna forma de garantizar que funcionará igual de bien para todos los dispositivos iOS, presentes y futuros? No quisiera asumir un formato de mapa de bits nativo que me cambie, reintroduciendo este problema.

Respuestas a la pregunta(1)

Su respuesta a la pregunta