最近测试总反应一个问题就是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时才执行动画。
提了个醒,在写这种一直循环的动画的时候一定要注意这一点。。。。