返回信息流昨天刚提交了一个大头贴拍摄和制作的应用给App Store,提交前用Allocations工具测试了一下,因为程序加载了300多张大头贴预览的png图片,所以内存一下占用到10多M,要是拍照的话估计得到20,30多M了,于是赶紧查询了一下。发现我忽视了图片文件的缓存问题,换一个图片加载的函数,居然让程序稳定到2M左右不动了,于是跟大家分享一下。
之前使用[UIImage imageNamed:]的方法每次加载图片都保存到缓存中,占据了很多空间,虽然这样在再次加载图片的时候会快很多,不过我已经将大头贴图片做了拍照时候的大图和预览用的小图。预览时每页加载9张小图速度很快,其实没有必要用缓存再提升速度,而大图每次拍照也就需要加载一张,所以也可以优化。
换成一下方法后,程序就占据内存不多了:
+ (UIImage *)newImageNotCached:(NSString *)filename
{
NSString *imageFile = [[NSString alloc] initWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], filename];
UIImage *image = [[UIImage alloc] initWithContentsOfFile:imageFile];
return image;
}
imageNamed每次都读图片到缓存中,只适合频繁使用的图片,而initWithContentsOfFile的方法加载图片后,不缓存,适合加载不常使用的图片。
希望能对大家有帮助!
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #4786同步于 2011/11/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
iOS加载多个UIImage Resource的优化方法(分享)
gongtao
2011/11/25镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
是啊,你用的是Xcode4么?如果是,你长按调试那个按钮,选择profile就行了。如果是之前版本的话要在工程的选项里面选
【 在 vagabond 的大作中提到: 】
: 话说Allocations 这个工具还没怎么用过啊。。。是xcode自带的吗?
: --
提醒一下: NSString *imageFile = [[NSString alloc] initWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], filename];
这一句有内存泄漏
另外,我猜测使用[UIImage imageNamed:]方法造成的内存占用过多问题可能是因为该方法将UIImage对象放到了系统的autorealeasepool中,没来得及回收,只是猜测。。
貌似lz用ARC了 so没release
【 在 xiaolanhaitj 的大作中提到: 】
: 提醒一下: NSString *imageFile = [[NSString alloc] initWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], filename];
: 这一句有内存泄漏
: 另外,我猜测使用[UIImage imageNamed:]方法造成的内存占用过多问题可能是因为该方法将UIImage对象放到了系统的autorealeasepool中,没来得及回收,只是猜测。。
: ...................
我用了ARC模式,Xcode 4.2的新功能,不用写代码释放内存,不好意思,没注明。那个方法是放到内存中,不是没来得及回收,它是不回收,它是为了方便你下次加载,提高速度和效率的。
【 在 xiaolanhaitj 的大作中提到: 】
: 提醒一下: NSString *imageFile = [[NSString alloc] initWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], filename];
: 这一句有内存泄漏
: 另外,我猜测使用[UIImage imageNamed:]方法造成的内存占用过多问题可能是因为该方法将UIImage对象放到了系统的autorealeasepool中,没来得及回收,只是猜测。。
: ...................