===
#import "CHViewController.h"
@interface CHViewController ()
@end
@implementation CHViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void) playAnimation:(int)count filename:(NSString *)filename{
//创建可变数组
NSMutableArray *imagesArray = [[NSMutableArray alloc] init];
//添加图片
/*加载图片缓存问题:
1.有缓存(无法释放,参数传的是文件名)
[UIImage imageNamed:@""];//经常使用的可以用这个方法
2.无缓存(用完就会释放,参数传的是全路径)
[[UIImage alloc] initWithContentsOfFile:path];//占用内存大的不经常使用的用这个
*/
for(int i=0;i<count;i++){
NSString *name = [NSString stringWithFormat:@"%@_%02d.jpg",filename,i];
// UIImage *image = [UIImage imageNamed:name];//有缓存
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:nil];
UIImage *img = [[UIImage alloc] initWithContentsOfFile:path];//无缓存
[imagesArray addObject:img];
}
//动画效果
_tom.animationImages = imagesArray;
_tom.animationDuration = 0.1 * count;
_tom.animationRepeatCount = 1;
[_tom startAnimating];
}
//找到配置文件tom.plist的路径
- (IBAction)btnClick:(UIButton *)sender {
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"tom" ofType:@"plist"];
//根据文件路径加载字典
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
//获取按钮中的title值
NSString * title = [sender titleForState:UIControlStateNormal];
//获取字典中事件对应的图片count
int count = [dict[title] intValue];
NSLog(@"%@-%d",title,count);
[self playAnimation:count filename:title];
}
@end
=
上次写的程序,发现在模拟器中运行后,内存一直保持在好几百兆,这样一旦在手机上运行,肯定卡退
所以这里我通过懒加载和清楚内存操作实现内存控制:
第一处:类似与单例模式,只能创建一次
- (void)playTom:(UIButton *)play{
if([_tom isAnimating]) return;//必须等待一个事件完成后才能下一个事件
第二处:这里右两种方式
- (void)playAnimation:(int)count fileName:(NSString *)fileName{
NSMutableArray *imagesArray = [[NSMutableArray alloc] init];
for(int i = 0;i < count;i++){
NSString *name = [NSString stringWithFormat:@"%@_%02d.jpg",fileName,i];
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:nil];
UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];
[imagesArray addObject:image];
}
_tom.animationImages = imagesArray;
_tom.animationDuration = 0.1*count;
_tom.animationRepeatCount = 1;
[_tom startAnimating];
//实现动画完成就清空图片所占内存
//[_tom performSelector:@selector(clearTom) withObject:nil afterDelay:_tom.animationDuration];
[_tom performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:_tom.animationDuration];
}
- (void)clearTom{
_tom.animationImages = nil;
}
通过内存分析,可以看出来确实能实现一个功能之后的内存清空: