IOS 多个UIImageView 加载高清大图时内存管理

简介:

IOS 多个UIImageView 加载高清大图时内存管理

 当我们在某一个View  多个UIImageView,且UIImageView都显示的是高清大图,就有可能出现内存警告的问题。如果第一次进入这个view,没有发生内存警告,当再次进入这个view,如果上一次的内存没有及时释放,这一次次的累加,便可导致内存崩溃。


1,UIImage 加载图片的方式。

      如果是本地图片,尽量不要使用 [UIImage  imageNamed:nil]; 这种方式,如果使用这种方式加载,只要程序不退出,它便一直会在内存中。

     我们可以使用 :

                        NSString *path = [[NSBundlemainBundle]pathForResource:@'"图片的名字" ofType:@""];

                        UIImage *image = [UIImageimageWithContentsOfFile:path];


         那两者的优缺点就很明显了,[UIImage  imageNamed:nil]; 只需加载一次,它便在内存中,所以第二次加载速度很快。而第二种加载方式由于我们将它释放掉了,会再次加载。所以选用那种方式,依你情况而定。


2,上面说的第二种方式,虽然可以释放掉,但我们要告诉人家什么时候释放。也就是说,当前显示页面不是这个view时,我们便将它释放掉:

- (void)viewWillDisappear:(BOOL)animated{

    [UIImageView removeFromSuperview];

    UiImageView = nil;

}


当然,当我们再次进入这个view时,便要将移除掉的view再次添加进来


- (void)viewDidAppear:(BOOL)animated{

   [self addSubView:UIImageView];

}


3,上述两种方式,主要解决内存累加的问题。但如果第一次进入view,图片全部渲染在view上时,内存就崩溃了。那我们只能在图片上做文章了。我们加载的高清大图如果差不多都是3000*2000,也可能比这个还大,就算我们的程序是iPad App,iPad 4  的分辨率才多少,这些图远远大于设备的分辨率,完全是资源浪费,所以我们通常的一个做法,便是将这样的图以小尺寸渲染到view上。


推荐使用:


常用方法:


 UIImage *image 

 UIImage *thumbImage = [imagethumbnailImage:140// This should the size of the view in collection view. example: myCell width is 20 and height is 20.

                                      transparentBorder:0

                                          cornerRadius:0

                                   interpolationQuality:kCGInterpolationMedium];       //生成缩略图




            // this "resizedimage" image is what you want to pass to setImage

            UIImage * resizedImage = [imageresizedImage:imageview.frame.sizeinterpolationQuality:kCGInterpolationLow];   //生成你想要尺寸的图



    造成的问题,要注意缩放的比例,不要导致图片变形,由于尺寸缩小,可能会导致图片模糊,注意缩小的尺寸。



   综上可见,每种方法有优点,有缺点。主要依据自己的开发情况,折中使用。










本文转自 卓行天下  51CTO博客,原文链接:http://blog.51cto.com/9951038/1747469,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
Linux Go API
MemoryModule内存反射DLL加载探索
MemoryModule内存反射DLL加载探索
|
5月前
|
缓存 Java 数据库
Springboot项目启动时加载数据库数据到内存
Springboot项目启动时加载数据库数据到内存
|
6月前
|
iOS开发 MacOS
iOS指定加载任意语言
iOS指定加载任意语言
46 2
|
9月前
|
存储 Java 编译器
JVM学习日志(六) JVM从加载到内存全过程
JVM从加载到内存全过程 简述
54 0
JVM学习日志(六) JVM从加载到内存全过程
|
10月前
|
前端开发 JavaScript Java
移动端性能优化:减少应用的加载时间和内存占用
移动应用的性能对用户体验至关重要。在移动设备上,加载时间和内存占用是两个主要的性能指标。本文将介绍一些有效的技术和策略,帮助开发人员优化移动应用的加载时间并减少内存占用,以提升应用的性能和响应速度。
161 0
|
12月前
|
Swift iOS开发
IOS使用Swift加载Xib文件
IOS使用Swift加载Xib文件
235 0
|
iOS开发 异构计算
如何增加 iOS APP 虚拟地址空间及内存上限?XNU 内核源码解读
1. 引言 最近一段时间在做钉钉 iOS 内存专项治理,解决内存不足时的 jetsam 事件及 malloc 的异常崩溃。在进程创建时系统会为每个 app 设定内存最大使用上限,内核会维护一个内存阈值优先级列表,当设备内存不足时低优先级的 app 会首先被内核中止进程。在阅读 XNU 内核源码过程中我们发现提供系统了两种能力可以扩展 App 的虚拟地址空间(com.apple.developer.kernel.extended-virtual-addressing)和增加内存使用上限(com.apple.developer.kernel.increased-memory-limit)。
1411 0
如何增加 iOS APP 虚拟地址空间及内存上限?XNU 内核源码解读
|
API iOS开发 Perl
iOS UIImageView文字头像,首字母缩略头像
iOS UIImageView文字头像,首字母缩略头像
iOS UIImageView文字头像,首字母缩略头像
|
存储 算法 Java
iOS开发 - 穿针引线之内存管理(二)
iOS开发 - 穿针引线之内存管理
192 0
|
存储 程序员 C语言
iOS开发 - 穿针引线之内存管理(一)
iOS开发 - 穿针引线之内存管理
158 0