iOS中UIImage的注意事项

上的文章已经不再维护,有兴趣阅读其他文章,或一起交流的朋友,请移步 我的博客:punmy.cn

原文


  • 加载
    • 谨慎使用[UIImage imageNamed:],imageNamed会做缓存,一般用于加载app生命周期内频繁被使用的图片和UI资源,有助于加快加载速度。而对于一次性使用的UI资源、尺寸过大的图片,不建议使用。

    • 对于一次性使用、尺寸较大的图片资源,可以通过路径的方式创建UIImage:
      NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"image_mic" ofType:@"png"];
      [UIImage imageWithContentsOfFile:imagePath];

    • imageNamed缓存过的图片,如果有指向其CGImage的CGImageRef,不能随意释放,一旦释放,后续再次使用imageNamed创建图片,就会得到野指针。更有甚者,可能导致内存疯狂暴增,使整个iOS系统瘫痪。(iPod touch 5 - iOS 8.0执行如下代码时秒崩,只能通过重启来恢复)
      UIImage superImage = [UIImage imageNamed:@"image_mic.png"];
      CGImageRef imageRef = superImage.CGImage;
      /
      * 做一些操作。。。 */
      //相当于释放掉了UIImage的缓存
      CGImageRelease(imageRef);

        //再次创建UIImage,得到野指针(在此处概率性崩溃)
        UIImage *superImage = [UIImage imageNamed:@"image_mic.png"];
        //再次引用野指针
        CGImageRef imageRef = superImage.CGImage;
        //对野指针进行释放操作,内存泄漏,重复几次后iPod touch 5 系统崩溃
        CGImageRelease(imageRef); // bomb!!!
      
  • 图片方向
    • 部分加载的图片附带Exif信息,需要注意在处理之前进行方向矫正,否则在处理后可能会图片数据错误,如图片方向总是颠倒。
  • 图片保存
    • 将图片保存到相册,通过UIImage格式保存,系统在编码成JPEG格式存在压缩,对于反复处理反复保存同一张图片会造成图片质量变差出现问题。务必保存的时候手动编码格式,并把质量设置为最大值。

你可能感兴趣的:(iOS中UIImage的注意事项)