iOS开发,图片太多占内存太大如何解决

本文深入探讨iOS图片加载方法的优化策略,重点分析了`UIImage.imageNamed:`的内存泄露问题,提供了使用`UIImage.imageWithContentsOfFile:`的替代方案,并通过实例展示了如何在图片浏览器应用中高效加载和管理图片资源,以减少内存占用。
摘要由CSDN通过智能技术生成

写在前面

加载图片的方式
在ios中,为了方便都这样加载图片 myImage = [UIImage imageNamed:@"icon.png"]; 如果你也这样加载的话,要小心了,这种方法在一些图片很少或者图片很小的时候是没问题的,在大量加载图片时候如果这样会造成内存占用过大.
WHY
实际上[UIimage  imageNamed:imageName]这个方法在图片使用完成之后不会被肢解释放掉,具体的释放时间是由系统决定的,所以这个方法只适用于图片小和一些常用的图像处理.
嚼个栗子

当我们做简单的图片浏览器时,就不适合用这个方法来加载图片,那么这里列一个简单粗糙的方法:

for (int i = 0; i<100; i++) {
    NSString *imagename = [NSString stringWithFormat:@"img_%d",i];
    NSString *path = [[NSBundle mainBundle] pathForResource:imagename ofType:nil];
    //可以理解成将图片的地址放到我们需要的地方去
    UIImage *image = [UIImage imageWithContentsOfFile:path];
}
小解(不是小解~.~)

1.为什么尽量避免使用imageNamed?

 使用这种方式生成的对象被autorelease之后,图片依然存在于内存,并不会及时回收,并且没有明确的释放方法。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存。
 这是为什么?如果对于大量同一图片的重复,使用这个方法可行。以这种方式加载的图片会缓存一份在内存中,以后如果发现有同名的图片,则不会再次加载。缺点是这份缓存无法预知释放时间与条件。      

2.最好使用方式:imageWithContentsOfFile,根据文件路径加载图片。

这种方式加载的图片不会缓存在内存中,当对象被释放之后,图片也会被释放。
 #define recourcesPath [[NSBundle mainBundle] resourcePath]

    NSString * imageFile
 = [[NSString alloc] initWithFormat:@"%@/%@",recourcesPath, filename];

UIImage
 * tempImage = nil;
    tempImage = [[UIImage alloc] initWithContentsOfFile:imageFile];
    [imageFile release];
    imageFile = nil;
这样得到的图片tempImage,并不是autorelease,这可以手动释放,释放的时候已将图片从内存中清除,可控内存是它的优点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值