• imageNamed和imageWithContentsOfFile-无法加载图片的问题


    问题描述

    图片资源放在Assets.xcassets中,分别用UIImage的类方法imageNamed和imageWithContentsOfFile获取图片对象,但发生奇怪的情况,前者获取到图片对象,后者结果为nil。代码如下:

    1.通过UIImage的类方法imageNamed:可以获取到图片对象。

    UIImage *imge = [UIImage imageNamed:@"test.jpg"];

    2.但通过UIImage的类方法imageWithContentsOfFile:得到img为nil

    //NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"jpg"];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"test.jpg" ofType:nil];
    UIImage *imge = [UIImage imageWithContentsOfFile:path];

    问题分析

    其实,UIImage创建对象有两种方法:

    •  imageNamed:创建的对象会缓存到系统内存中,不会立即释放到内存。好处是再次加载使用这种方式会减少读取操作,加快程序运行。缺点:加载过多图片会占用大量内存空间。
      1. 创建图片对象,首先在缓存中查找是否有该对象,有则直接取出对象,
      2. 没有则从bundle中查找图片资源,有则创建对象并返回。
      3. bundle中也没有图片资源,则返回nil。
    •  imageWithContentsOfFile:mageWithContentsOfFile创建的对象不会缓存到系统内存中。好处是不产生缓存。缺点:对于经常使用的小图片,会频繁读取。

    imageNamed只需传文件名,imageWithContentsOfFile需要传入文件全路径,而文件全路径可以通过NSBundle得到。

    注意:

    如果在项目中的Assets.xcassets(蓝色文件夹

    • 不可以NSBundle获得资源路径,然后imageWithContentsOfFile加载
    • 可以imageNamed加载

    如果在项目中真实文件夹(蓝色文件夹,除Assets.xcassets):

    • 可以NSBundle获得资源路径,然后imageWithContentsOfFile加载。注意要带文件夹路径,例如[[NSBundle mainBundle]pathForResource:@"test.jpg" ofType:nil inDirectory:@"image"]
    • 不可以imageNamed加载

    如果在项目中虚拟文件夹(黄色文件夹):

    • 可以NSBundle获得资源路径,然后imageWithContentsOfFile加载
    • 可以imageNamed加载

    问题解决

         只能imageNamed获取Assets.xcassets的图片资源

    学习,以记之。如有错漏,欢迎指正

    作者:冯子武
    出处:http://www.cnblogs.com/Zev_Fung/
    本文版权归作者和博客园所有,欢迎转载,转载请标明出处。
    如果博文对您有所收获,请点击下方的 [推荐],谢谢

  • 相关阅读:
    java学习笔记-设计模式12(组合模式)
    Java神奇的装箱与拆箱
    博客得不到搜索引擎的收录!
    Java中E、T、K、V、N的含义
    【转】解决Ubuntu下Sublime Text 3无法输入中文
    【转】Windows和Ubuntu双系统,修复UEFI引导的两种办法
    30分钟学会正则表达式
    推荐一个android各种工具的墙内下载网站
    如何为Android Studio 添加快速启动方式【Linux】
    Linux 更改用户环境变量和所有用户环境变量
  • 原文地址:https://www.cnblogs.com/Zev_Fung/p/5407642.html
Copyright © 2020-2023  润新知