1.当应用程序收到内存警告时,AppDelegate中的- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;先收到通知进行执行,然后是按栈中存放的顺序的控制器中的- (void)didReceiveMemoryWarning;收到通知进行执行.
2.如果当前视图控制器正在屏幕上显示,如果在- (void)didReceiveMemoryWarning;方法中执行self.view = nil; 则会导致白屏现象.
3.如果在栈顶存放的控制器的- (void)didReceiveMemoryWarning;方法中执行self.view = nil; 则该视图控制器的view将会被销毁清空.如果紧接着执行self.view进行打印视图,就相当于调用了当前控制器属性view的get方法,这时候系统就会找不到view就会重新执行loadView方法加载创建一个view给当前的视图控制器,如果是storyboard或者xib创建的view就从storyboard或者xib中加载view.
4.如果在3的基础上只执行self.view = nil;不调用self.view,则从后一个视图控制器返回根控制器的时候,发现根控制器的view不存在,就会重新执行loadView方法加载创建一个view给当前的视图控制器,如果是storyboard或者xib创建的view就从storyboard或者xib中加载view.我们就会看到和原来一样的根控制器页面.
5.在iOS6以后,如果不手动设置self.view = nil,系统是不会回收控制器的view的,除非达到一定条件或者系统关闭了这个应用才会回收内存资源.
6.平时在开发过程中不需要对控制器的- (void)didReceiveMemoryWarning;方法进行任何操作,基本不会出现内存警告,如果真的出现内存警告就说明代码写的有问题,内存没有管理好,需要检查代码.
7.可以写两个控制器实现相关的方法,来回跳转并模拟内存警告,可以看到相关方法的调用和执行情况.
网友评论