问题描述

图片资源放在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的图片资源

imageNamed和imageWithContentsOfFile-无法加载图片的问题的更多相关文章

  1. iOS两种方式加载图片的区别

    加载图片的方式: imageNamed: imageWithContentsOfFile: 加载Assets.xcassets这里面的图片: 1> 打包后变成Assets.car 2> 拿 ...

  2. iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile?

      Apple官方的文档为生成一个UIImage对象提供了两种方法: 1. imageNamed,其参数为图片的名字: 2. imageWithContentsOfFile,其参数也是图片文件的路径. ...

  3. 10、 iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile

    Apple官方的文档为生成一个UIImage对象提供了两种方法: 1. imageNamed,其参数为图片的名字: 2. imageWithContentsOfFile,其参数是图片文件的路径. 两种 ...

  4. 用imageNamed加载图片产生的问题

    通常我们会用imageNamed:来加载图片,但是用这个API有个问题,就是它会缓存加载的image. 因此,对于那些被重用的图片,这个API很高效.但是对于那些使用很少的图片,用这个就很耗内存,那怎 ...

  5. UIImage加载图片的两种方法区别

    Apple官方的文档为生成一个UIImage对象提供了两种方法加载图片: 1. imageNamed,其参数为图片的名字: 2. imageWithContentsOfFile,其参数也是图片文件的路 ...

  6. 多线程异步加载图片async_pictures

    异步加载图片 目标:在表格中异步加载网络图片 目的: 模拟 SDWebImage 基本功能实现 理解 SDWebImage 的底层实现机制 SDWebImage 是非常著名的网络图片处理框架,目前国内 ...

  7. UIImage加载图片的区别和渲染模式

    前言 关于本地图片UIImage的加载问题,还是需要注意的.不同的加载处理方式,在效率和性能上还是有差异的. 今天,我们来讲讲UIImage的加载应该选择什么样的API来加载! 两种API 这两种AP ...

  8. UIImage加载图片的方式以及Images.xcassets对于加载方法的影响

    UIImage加载图片的方式以及Images.xcassets对于加载方法的影响 图片缓存 根据是否将创建好的对象缓存入系统内存,有两类创建UIImage对象的方法可选: 缓存:+ imageName ...

  9. IOS中UITableView异步加载图片的实现

    本文转载至 http://blog.csdn.net/enuola/article/details/8639404  最近做一个项目,需要用到UITableView异步加载图片的例子,看到网上有一个E ...

随机推荐

  1. [译]在Mac上运行ASP.NET 5

    原文:http://stephenwalther.com/archive/2015/02/03/asp-net-5-and-angularjs-part-7-running-on-a-mac 这篇文章 ...

  2. Excel 使用宏批量修改单元格内指定文字为红字

    -> step 1:新建宏,进入编辑,使用如下代码: Sub Ss()Dim c As RangeFor Each c In ActiveSheet.UsedRange i = 1 While ...

  3. [AngularJS] 入门

    什么是AngularJS AngularJS是Google开源的一款JavaScript MVC框架,弥补了HTML在构建应用方面的不足, 其通过使用指令(directives)结构来扩展HTML词汇 ...

  4. STM32 之 NVIC(中断向量、优先级) 简述

    一.背景 需要使用STM32的CAN进行通信,经过一系列配置后,已可正常收发,还剩下一个CAN通信的错误处理.可错 误中断使能寄存器已经配置使能了,出错后就是无法进入"CAN1_SCE_IR ...

  5. Windows下如何修改php.ini的访问路径?

    Windows下,用 IIS跑PHP,有个缺点,那就是一定要把 php.ini 放在 Windows 的系统路径下 (C:/Windows) .不过,可以通过以下方式修改访问路径: 第一步: 把PHP ...

  6. Android Studio升级后,开启时遇到tools.jar seems to be not in Android Studio错误?

    工作半年多,电子工程小白一枚.今天上班的时候,与几位同事聊到博客的问题.平时都是在别人的博客里找到问题的解决之妙法, 今天一个冲动之下,我决定也开始用博客记录工作的点滴,暂且当作笔记一用. 出于工作需 ...

  7. Javascript高级程序设计——函数

    函数Function 通过函数封装多条语句,在任何地方执行.javascript函数不会重载,相同名字函数,名字属于后定义的函数通过function关键词声明. function functionNa ...

  8. Nginx反向代理多虚拟主机代理

    根据http://www.cnblogs.com/zzzhfo/p/6032095.html这个环境配置 在web01和web02上配置基于域名的虚拟主机 web01 [root@web01 /]# ...

  9. iOS开发初级课程

    iOS开发初级课程 针对学员 掌握Objective  C,C或者C++,有语言基础的学员,想从事iOS开发工作. iOS开发那些事-了解iOS开发(8集) 在课程中,我们首先介绍如何使用nib和故事 ...

  10. 160809212田京诚C语言程序设计实验2 选择结构程序设计_进阶

    实验2-6 猜数字游戏 实验要求: 编写一个C程序实现一个[1-100]以内的猜数字游戏. (1)       系统随机产生一个[1-100]之间的随机数. (2)       输入任意一个数字.数字 ...