iOS处理大图片

        在ios中,为了方便都这样加载图片 myImage = [UIImage imageNamed:@"icon.png"]; 如果你也这样加载的话,要小心了,这种方法在一些图片很少或者图片很小的时候是没问题的,在大量加载图片时候如果这样会造成内存占用过大。

当我们需要加载很多图片(相册)的时候我们一般会用[UIimage  imageNamed:imageName];


实际上[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];

}

ios 图片加载方式,内存控制,尽量避免使用imageNamed,使用ARC也需要 


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,这可以手动释放,释放的时候已将图片从内存中清除,可控内存是它的优点。




 ios 内存使用陷阱


在iphone开发过程中,代码中的内存泄露我们很容易用内存检测工具leaks 检测出来,并一一改之,但有些是因为ios 的缺陷和用法上的错误,leaks 检测工具并不能检测出来,你只会看到大量的内存被使用,最后收到didReceiveMemoryWarning,最终导致程序崩溃。以下是开发过程中遇到的一些问题和网上的一些资料,总结了一下:



一、[UIImage imageNamed:]只适合与UI界面中的贴图的读取,较大的资源文件应该尽量避免使用


用UIImage加载本地图像最常用的是下面三种:


1.用imageNamed方法


[UIImage imageNamed:ImageName];


2.用 imageWithContentsOfFile 方法


NSString *thumbnailFile = [NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], fileName];

UIImage *thumbnail = [UIImage imageWithContentsOfFile:thumbnailFile];


3. 用initWithContentsFile方法


UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath]



第一种方法为常见方法,利用它可以方便加载资源图片。用imageNamed的方式加载时,会把图像数据根据它的名字缓存在系统内存中,以提高imageNamed方法获得相同图片的image对象的性能。即使生成的对象被 autoReleasePool释放了,这份缓存也不释放。而且没有明确的释放方法。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存。


第二种方法加载的图片是不会缓存的。得到的对象时autoRelease的,当autoReleasePool释放时才释放。


第三种方法要手动release掉。不系统缓存。release后立即释放,一般用在封面等图比较大的地方。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值