1. 假设我们使用 +imageWithContentsOfFile: 方法从磁盘中加载一张图片,这个时候的图片并没有解压缩;
    2. 然后将生成的 UIImage 赋值给 UIImageView ;
    3. 接着一个隐式的 CATransaction 捕获到了 UIImageView 图层树的变化;
    4. 在主线程的下一个 run loop 到来时,Core Animation 提交了这个隐式的 transaction ,这个过程可能会对图片进行 copy 操作,而受图片是否字节对齐等因素的影响,这个 copy 操作可能会涉及以下部分或全部步骤:
      1. 分配内存缓冲区用于管理文件 IO 和解压缩操作;
      2. 将文件数据从磁盘读到内存中;
      3. 将压缩的图片数据解码成未压缩的位图形式,这是一个非常耗时的 CPU 操作;
      4. 最后 Core Animation 使用未压缩的位图数据渲染 UIImageView 的图层。

    在上面的步骤中,我们提到了图片的解压缩是一个非常耗时的 CPU 操作,并且它默认是在主线程中执行的。那么当需要加载的图片比较多时,就会对我们应用的响应性造成严重的影响,尤其是在快速滑动的列表上,这个问题会表现得更加突出。
    总结:在我们使用 UIImage 的时候,创建的图片通常不会直接加载到内存,而是在渲染的时候再进行解压并加载到内存。这就会导致 UIImage 在渲染的时候效率上不是那么高效。为了提高效率通过 decodedImageWithImage方法把图片提前解压加载到内存,这样这张新图片就不再需要重复解压了,提高了渲染效率。这是一种空间换时间的做法。

    解压是耗时的,而系统默认是在主线程执行,所以业界通常有一种做法是,异步强制解压,也就是在异步线程主动将二进制图片数据解压成位图数据,使用CGBitmapContextCreate(…)系列方法就能实现。
    该处理方式在众多图片处理框架下都有体现。