imageNamed
: 这个方法用一个指定的名字在系统缓存中查找并返回一个图片对象如果它存在的话。如果缓存中没有找到相应的图片,这个方法从指定的文档中加载然后缓存并返回这个对象。因此imageNamed的优点是当加载时会缓存图片。所以当图片会频繁的使用时,那么用imageNamed的方法会比较好。例如:你需要在 一个TableView里的TableViewCell里都加载同样一个图标,那么用imageNamed加载图像效率很高。系统会把那个图标Cache到内存,在TableViewCell里每次利用那个图 像的时候,只会把图片指针指向同一块内存。正是因此使用imageNamed会缓存图片,即将图片的数据放在内存中,iOS的内存非常珍贵并且在内存消耗过大时,会强制释放内存,即会遇到memory warnings。而在iOS系统里面释放图像的内存是一件比较麻烦的事情,有可能会造成内存泄漏。例如:当一 个UIView对象的animationImages是一个装有UIImage对象动态数组NSMutableArray,并进行逐帧动画。当使用imageNamed的方式加载图像到一个动态数组NSMutableArray,这将会很有可能造成内存泄露。原因很显然的。
imageWithContentsOfFile
:仅加载图片,图像数据不会缓存。因此对于较大的图片以及使用情况较少时,那就可以用该方法,降低内存消耗。
下面看实例进行求证:
我这里用到的是100张图片
oooooo
- (void)setImageNmaeContentsOfFile:(NSString *)img {
NSString *imgNmae = [NSString stringWithFormat:@"%@.jpg",img];
NSBundle *bundle = [NSBundle mainBundle];
NSString *resourcePath = [bundle resourcePath];
NSString *filePath = [resourcePath stringByAppendingPathComponent:imgNmae];
UIImage *imgs = [UIImage imageWithContentsOfFile:filePath];
_images = imgs;
}```
![](https://img.haomeiwen.com/i1859396/d6ea2b4bc122cd5c.png)
消耗的内存:
![](https://img.haomeiwen.com/i1859396/169bd5167818b1b4.png)
oooooo
- (void)setImageNmae:(NSString *)img {
_images = [UIImage imageNamed:img];
}```
![](https://img.haomeiwen.com/i1859396/99fe17dcc30e9f9c.png)
消耗的内存:
![](https://img.haomeiwen.com/i1859396/e6661aaa328a2dfc.png)
通过实际的代码运行可以对比出来imageWithContentsOfFile:是没有内存缓存的,imageNamed:是有内存缓存的他的缓存是什么时候清除的我们就不得知道了。如果在我们项目中使用了大量图片浏览用的是imageNamed:那就可想而知了。
下面在验证内存消耗:
imageWithContentsOfFile:
![](https://img.haomeiwen.com/i1859396/22a5bb49a025b895.png)
内存消耗:
![](https://img.haomeiwen.com/i1859396/49ffb51f514254cd.png)
imageNamed:
![](https://img.haomeiwen.com/i1859396/8eb4d3469fd81fe4.png)
内存消耗:
![](https://img.haomeiwen.com/i1859396/bf5eca8bce9259bc.png)
imageNamed:不管怎么滑动它内存是不会增加,imageWithContentsOfFile:滑动后它会增加大概增加到40左右就不会增加了一直在这个范围内变动。
网友评论