讲UIImageView帧动画的内存管理之前先简要讲一下UIImageView的帧动画是怎么实现的,一般同学可能是这么实现滴:
NSMutableArray *images = [NSMutableArray array];
for (int i = 0; i<count; i++) {
// 计算文件名
NSString *filename = [NSString stringWithFormat:@"%@_%02d.jpg", name, i];
// 加载图片
UIImage *image = [UIImage imageNamed:filename];
// 添加图片到数组中
[images addObject:image];
}
self.tom.animationImages = images;
// 2.设置播放次数(1次)
self.tom.animationRepeatCount = 1;
// 3.设置播放时间
self.tom.animationDuration = images.count * 0.05;
[self.tom startAnimating];
这样做确实简单,利用UIImageView的animationImages 属性一下子搞定。可是如果要加载的图片文件很多,比如说七八十张,那个内存占用就大了,在手机上极可能是闪退。
这就要针对UIimage的内存管理作优化了。其实就是 [UIImage imageNamed:filename]这行代码搞得鬼,这个是带缓存的加载方法。加载多少图片都缓存在内存里。所以imageNamed:方法一般是用作加载图标等小文件。对于加载大图片用什么方法呢?[UIImage imageWithContentsOfFile:]方法。这个要传入图片的全路径。注意。ios凡是方法后带File的都是传入全路径这个是不带缓存的加载方法。一旦没有指针指向UIImage了,图片就会释放,修改后的代码就是:
@property (weak, nonatomic) IBOutlet UIImageView *tom;
// 1.加载所有的动画图片
NSMutableArray *images = [NSMutableArray array];
for (int i = 0; i<count; i++) {
// 计算文件名
NSString *filename = [NSString stringWithFormat:@"%@_%02d.jpg", name, i];
// 加载图片
// imageNamed: 有缓存(传入文件名)
// UIImage *image = [UIImage imageNamed:filename];
// imageWithContentsOfFile: 没有缓存(传入文件的全路径)
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:filename ofType:nil];
UIImage *image = [UIImage imageWithContentsOfFile:path];
// 添加图片到数组中
[images addObject:image];
}
self.tom.animationImages = images;
// 2.设置播放次数(1次)
self.tom.animationRepeatCount = 1;
// 3.设置播放时间
self.tom.animationDuration = images.count * 0.05;
[self.tom startAnimating];
// 4.动画放完1秒后清除内存
CGFloat delay = self.tom.animationDuration + 1.0;
[self.tom performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:delay];
注意最后一句是让动画一放完就释放掉图片,放完后还占着这么多图片作什么呢?