记录iOS viewController无法dealloc的原因分析和解决过程

最近的一个项目,遇到一个很棘手的问题。有一个视图里面要实现网络视频播放,网络通信协议,收到的数据在UI动态显示出来。为了实现这些功能,采用了系统的几个功能,timer,Core Animation,AVPlayer,Network。一开始先把功能实现,然后测试的时候发现退出视图,内存并不释放,然后重新进入视图内存增加很快,而且感觉同时有2个视频在播放,网络协议的命令也重复发送和接受到2次。是什么原因呢?
一开始,我在dealloc函数里面增加断点,发现退出视图时不会调用,那么是什么原因导致呢?网上查的一下资料提到,如果VC的引用计数不为0,就不会被释放,也有人是如果使用了NSTimer,并且设置为repeat的方式,则会导致VC的引用+1,也有人说,如果使用了Animation,如果Animation没有结束的情况下,会导致VC不能退出;还有一种说法是如果存在delegate的情况,也可能无法被释放。总结这些情况,我尝试在viewDidDisappear里把timer invalidate,然后把animation remove掉,代码如下:

-(void)viewDidDisappear:(BOOL)animated{
NSLog(@"viewDidDisappear");
[self.repeatingTimer invalidate];
[self.syncTimer invalidate];
[self.layer removeAllAnimations];
}

但是即使是这样,dealloc还是不会被调用,然后我把animation有关掉调用关闭,如下:
[self.layer addAnimation:animation forKey:@"Animation"];
把这一行屏蔽之后,动画的效果就不会被执行,但dealloc成功调用了。
那么是什么原因导致调用animation后不能dealloc呢?会不会是因为我在timer里面调用animation导致?如果不用timer,而改为:
[self performSelector:@selector(timerLoop20ms)
withObject:nil
afterDelay:0.02];

这样的方式会怎样?经过试验,还是存在问题。
后来经过很多的办法,都没有解决,最后我总结,有可能是animation的底层没有设计好,或者我没有理解好他们的思路,总之现在要换一种思路,如果不用animation,是否能实现原来的功能?因为我这个案子里要实现的动画并不是很复杂,仅仅是一种字符的渲染过程,我可以通过软件的方式来实现同样的效果,而不必非要调用CA层的API。经过一番努力,终于把功能完成,效果还不错,经过试验不会导致dealloc不执行的问题。
软件实现动画,也需要创建一个CALayer,然后通过这个layer来对相应的对象进行动画操作,我猜测在更新layer的bounds的时候,会隐式地调用动画的功能,隐式动画的调用有一个问题就是无法设置动画的周期,不过这并不影响我的最终实现效果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值