IOS 开发之UIImageView帧动画的内存管理

     讲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];



注意最后一句是让动画一放完就释放掉图片,放完后还占着这么多图片作什么呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值