iOS攻略之收到内存警告的处理(转)
2015-11-23 19:26
337 查看
iOS 5 和 更早之前
1. 系统发出警告或者ViewController本身调用导致didReceiveMemoryWarning被调用
2. 调用viewWillUnload之后释放View
3. 调用viewDidUnload
ios5.0 LeaksDemo
iOS 6 和之后
1. 系统发出警告或者ViewController本身调用导致didReceiveMemoryWarning被调用
2. - (void)didReceiveMemoryWarning;中释放当前不在使用的资源
ios6.0 LeaksDemo
内存不足时的处理
内存警告关乎到一个进程问题!每一个程序都是一个进程,有的进程在程序进入后台之后就开始了休眠,而有些程序进入后台却还一直在运行程序,比如QQ!当控制器接受到内存警告之后,会做如下方法:
1. 当控制器接收到内存警告时,会调用 didReceiveMemoryWarning 方法
2. didReceiveMemoryWarning方法内部的默认实现以下步骤: 首先会检测控制器的view在不在屏幕上
当需要再次使用控制器的view时,又会调用loadView方法来创建view
接着会调用一系列的生命周期方法
viewDidLoad —> ……
生命周期循环
loadView –> viewDidLoad –> ..可见.. –内存警告–> didReceiveMemoryWarning —> viewWillUnload –> viewDidUnload —再次使用—> loadView
所以当我们的程序内存过大时,我们挂载在后台的QQ有时候会出现已经推出的情况!当我们再次点击的时候,QQ又重新加载运行起来!
1. 系统发出警告或者ViewController本身调用导致didReceiveMemoryWarning被调用
2. 调用viewWillUnload之后释放View
3. 调用viewDidUnload
ios5.0 LeaksDemo
-(void)didReceiveMemoryWarning { //In earlier versions of iOS, the system automatically attempts to unload a view controller's views when memory is low [super didReceiveMemoryWarning]; //didReceiveMemoryWarining 会判断当前ViewController的view是否显示在window上,如果没有显示在window上,则 didReceiveMemoryWarining 会自动将viewcontroller 的view以及其所有子view全部销毁,然后调用viewcontroller的viewdidunload方法。 } - (void)viewDidUnload { // 被release的对象必须是在 viewDidLoad中能重新创建的对象 // For example: self.myOutlet = nil; self.tableView = nil; dataArray = nil; [super viewDidUnload]; }
iOS 6 和之后
1. 系统发出警告或者ViewController本身调用导致didReceiveMemoryWarning被调用
2. - (void)didReceiveMemoryWarning;中释放当前不在使用的资源
ios6.0 LeaksDemo
-(void)didReceiveMemoryWarning { [super didReceiveMemoryWarning];//即使没有显示在window上,也不会自动的将self.view释放。注意跟ios6.0之前的区分 // Add code to clean up any of your own resources that are no longer necessary. // 此处做兼容处理需要加上ios6.0的宏开关,保证是在6.0下使用的,6.0以前屏蔽以下代码,否则会在下面使用self.view时自动加载viewDidUnLoad if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0) { //需要注意的是self.isViewLoaded是必不可少的,其他方式访问视图会导致它加载,在WWDC视频也忽视这一点。 if (self.isViewLoaded && !self.view.window)// 是否是正在使用的视图 { // Add code to preserve data stored in the views that might be // needed later. // Add code to clean up other strong references to the view in // the view hierarchy. self.view = nil;// 目的是再次进入时能够重新加载调用viewDidLoad函数。 } } }
内存不足时的处理
内存警告关乎到一个进程问题!每一个程序都是一个进程,有的进程在程序进入后台之后就开始了休眠,而有些程序进入后台却还一直在运行程序,比如QQ!当控制器接受到内存警告之后,会做如下方法:
1. 当控制器接收到内存警告时,会调用 didReceiveMemoryWarning 方法
2. didReceiveMemoryWarning方法内部的默认实现以下步骤: 首先会检测控制器的view在不在屏幕上
if (self.view.superview == nil) { // 检测控制器的view在不在屏幕上 // 就会尝试销毁控制器的view // 即将销毁的时候,就会调用控制器的 viewWillUnload // 销毁完毕的时候,就会调用控制器的 viewDidUnload方法 } else { // 不销毁控制器的view }
当需要再次使用控制器的view时,又会调用loadView方法来创建view
接着会调用一系列的生命周期方法
viewDidLoad —> ……
生命周期循环
loadView –> viewDidLoad –> ..可见.. –内存警告–> didReceiveMemoryWarning —> viewWillUnload –> viewDidUnload —再次使用—> loadView
所以当我们的程序内存过大时,我们挂载在后台的QQ有时候会出现已经推出的情况!当我们再次点击的时候,QQ又重新加载运行起来!
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- IE7降低内存和降低CPU的几个技巧
- 如何高效的使用内存
- DOS下内存的配置
- XP/win2003下发现1G的内存比512M还慢的解决方法
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- SQL语句实现查询SQL Server内存使用状况
- C语言内存对齐实例详解
- 深入学习C语言中memset()函数的用法
- 全局变量与局部变量在内存中的区别详细解析
- VB读取线程、句柄及写入内存的API代码实例
- php运行提示:Fatal error Allowed memory size内存不足的解决方法
- IE浏览器IFrame对象内存不释放问题解决方法