今天客户反映app闪退,让他拍视频过来,初步判断应该是数组越界了。
看代码调试之后发现是产生了一个野指针。
先交代下背景吧,在Appdelegate里边声明一个UIViewController对象curViewController,保存的是当前显示在屏幕上的ViewController,然后在公共父类的-(void)viewDidAppear:(BOOL)animated;方法里面把app.curViewController指向self,这样每次push或者present一个页面的时候都可以把当前的页面指针保存下来,然后在需要的地方就可以直接调用这个对象来判断当前在哪个页面,然后可以拿到当前页面并且执行一些相应的操作。
App的页面层级是这样的:一个tabBarController上面有三个页面,第一个是房间界面,第二个是控制界面,第三个是设置界面。在房间界面选择房间之后进去控制界面可以对相应的房间进行一些设置。然后控制界面还可以push去另一个界面A。
问题就出在从界面A pop回来之后,一旦使用curViewController这个对象程序就会崩溃,就连打印都不行。分析应该是产生了野指针,后来又在-(void)viewDidAppear:(BOOL)animated;打断点发现进入控制界面的时候-(void)viewDidAppear:(BOOL)animated;这个方法一直都没有执行。别的界面都有执行这个方法唯独这个界面没有执行,在声明文件里面看这个类也是继承于那个公共父类的,没道理不执行的,然后才发现是在控制界面的实现里面重写了-(void)viewDidAppear:(BOOL)animated;这个方法,并且没有调用父类的方法[super viewDidAppear:animated];,所以每次进入控制界面之后curViewController指向的都是控制界面之前的界面,而没有执行-(void)viewDidAppear:(BOOL)animated方法也就没有指向控制界面。
为什么一直都没有发现这个问题呢,因为除了控制界面进去的那个A界面,其余的界面在进去控制界面之后都不会出栈(也就是说只有A界面会pop到控制界面),所以从A界面pop到控制界面之后curViewController就指向了一个已经出栈了的界面,这是使用这个对象就会出现崩溃。解决方法很简单,就是在控制界面的-(void)viewDidAppear:(BOOL)animated方法里面加上一句[super viewDidAppear:animated];调用父类的这个方法让curViewController指向当前的界面。