关于循环动画

最近测试总反应一个问题就是APP使用过二维码扫描之后,手机总是会出现发烫,耗电量增加的问题,插上手机,打开Xcode开始debug.

前前后后折腾了一会,发现,打开二维码扫描界面的时候一切正常,但是当push到其他界面之后,CPU的使用率飙到100+%,耗电量也变成了very heigh,绝对是一个重大缺陷尴尬


于是开始排查问题,一开始想到的是AVCaptureSession的对象没有释放,但是明明走了stopRuning的方法,所以不是这里。

#pragma mark 扫描动画
- (void)scanAnimate{
    CGRect rect = CGRectMake(0, - 0.625 * SCREEN_WIDTH, 0.625 * SCREEN_WIDTH, 0.625 * SCREEN_WIDTH);
    if (!_lineView) {
        _lineView = [[UIImageView alloc] initWithFrame:rect];
        [_lineView setImage:[UIImage imageNamed:@"网格"]];
        [scanZomeBack addSubview:_lineView];
    }else{
        _lineView.frame = rect;
    }
    
    [UIView animateWithDuration:1.5 animations:^{
        _lineView.frame = CGRectMake(0, 0, 0.625 * SCREEN_WIDTH, 0.625 * SCREEN_WIDTH);
    } completion:^(BOOL finished) {
        [self scanAnimate];
    }];
}

还有一个地方就是扫描动画,因为要一直循环动画,所以这里就在动画的block里面又调用了动画方法。

这样就形成了一个类似递归的死循环,永远也不会完成,由于动画没有完成,即使页面推出了,也没有执行dealloc方法,导致页面不释放,继续执行动画,产生了离屏渲染的现象,导致手机发热,耗电量激增,解决的办法也很简单:

第一种:

#define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self;
WS(weakSelf);
用弱引用的self去调用自身,这样推出界面,slef也被释放,不会发生死循环


第二种:

设置一个布尔值,didLoad中为YES,willDismiss中设置为NO

YES时才执行动画。

提了个醒,在写这种一直循环的动画的时候一定要注意这一点。。。。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值