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

来源:互联网 发布:三国杀灵雎淘宝价格 编辑:程序博客网 时间:2024/06/07 11:14

最近的一个项目,遇到一个很棘手的问题。有一个视图里面要实现网络视频播放,网络通信协议,收到的数据在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的时候,会隐式地调用动画的功能,隐式动画的调用有一个问题就是无法设置动画的周期,不过这并不影响我的最终实现效果。

原创粉丝点击