IOS中的内存不足警告处理(译)
由于在IOS中虚拟内存系统不会采用页置换的方式来获取请求内存,取而代之的是它通过移除应用程序中的强引用来释放一些内存资源,我们知道强引用在IOS中表示拥有关系,只要有至少一个变量拥有这个对象,那么对象就不会被释放,当然IOS中没有类似Java或.NET的垃圾回收机制,所以我们需要手动来释放对象的引用。当然在ARC中,编译器会在编译阶段为我们插入这段释放代码。释放其实就是减少引用计数,有关于引用计数在内存管理中的应用,我会在另一篇文章中做描述。
当可用虚拟内存页的数量低于系统规定的临界值时,系统会尽可能自动释放那些只读的内存页,同时也会向当前运行的应用程序发送一个内存不足的警告。当你的应用程序接收到这个消息通知时,我们应该重视它,一旦我们接收到这样的消息,我们的应用程序必须尽可能的移除尽可能多的对象的强引用。例如,我们可以清除那些可以再次读取到的数据缓存。
UIKit为我们提供了很多方式来接收这些内存管理通知,如下所示:
实现应用程序代理的
applicationDidReceiveMemoryWarning:方法。(AppDelegate)重写自定义控制器的
didReceiveMemoryWarning方法。(UIViewController)通过注册接收
UIApplicationDidReceiveMemoryWarningNotification消息通知。(NSNotificationCenter)
一旦接收到内存警告通知,我们的处理器方法应该马上移除一些对象的强引用。控制器会自动移除那些当前不在屏幕上显示的对象引用,但是我们最好还是需要覆写一下didReceiveMemoryWarning方法来移除一些我们控制器不需要的额外的对象引用。例如:当导航控制器Navigation Controller接收到内存警告后,它会首先判断它所包含的控制器是否存在一个非空View,然后会询问是否这个View可以被销毁(例如当前需要显示在界面上的View原则上不可以被销毁),如果可以被销毁,那么系统会直接回收这个View所占用的内存,当然这个View呈现所依赖的数据这个时候最好通过代码移除(例如:self.data = nil;),View都不存在了,那些数据也就没有存在的必要了(ViewDidUnLoad处理,新版本已经废弃了该方法)。下面引用苹果官方的一个流程图:

如果我们仅仅只有很少的一些可清除的对象资源,我们可以通过注册 UIApplicationDidReceiveMemoryWarningNotification消息通知来移除这些引用。如果我们有很多可清楚的对象并且期望选择性的清除一些,那么我们最好使用应用程序代理来决定哪些对象该保留哪些对象该清除,那么实现 applicationDidReceiveMemoryWarning:方法将会是一种更好的选择。
和系统应用程序一样,我们的应用程序应该总是处理内存不足的警告,即使在我们测试时没有接受到这些警告消息。当系统检测到内存不足时,系统会将内存不足消息警告分发给所有在运行中的应用程序,有可能会直接终止掉某些后台应用程序来释放内存压力。如果还没有足够的内存给我们应用程序使用,系统会认为我们的应用程序可能发生了内存泄露或者是使用了太多的内存,然后系统会无情的终止我们的应用程序。听起来真得很残暴。
IOS中的内存不足警告处理(译)的更多相关文章
- ios系统 处理内存警告
iPhone下每个app可用的内存是被限制的,如果一个app使用的内存超过20M,则系统会向该app发送Memory Warning消息.收到此消息后,app必须正确处理,否则可能出错或者出现内存泄露 ...
- iOS程序中的内存分配 栈区堆区全局区
在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同.一.内存分区 栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等.栈是系统数据结构,对 ...
- iOS图片加载到内存中占用内存情况
我的测试结果: 图片占用内存 图片尺寸 .png文件大小 1MB 512*512 316KB 4MB 10 ...
- ios开发——错误总结篇&开发中常见错误和警告总结(四)
ios开发——开发总结&开发中常见错误和警告总结(四) 网易彩票实战总结(错误) 错误总结之类的实现 经典错误之重复定义与导入错误 经典错误关于父类的实现 通知对象: 控制器的定义 Xcode ...
- iOS中引用计数内存管理机制分析
在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序. 操作系统的内存管理分成堆和 ...
- 【转】cocos2d-x与ios内存管理分析(在游戏中减少内存压力)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=281 注:自己以前也写过coco ...
- cocos2d-x与ios内存管理分析(在游戏中减少内存压力)
转自:http://www.cocos2dev.com/?p=281 注:自己以前也写过cocos2d-x如何优化内存的使用,以及内存不足的情况下怎么处理游戏.今天在微博中看到有朋友介绍了下内存,挺详 ...
- 【iOS系列】-iOS中内存管理
iOS中创建对象的步骤: 1,分配内存空间,存储对象 2,初始化成员变量 3,返回对象的指针地址 第一:非ARC机制: 1,对象在创建完成的同时,内部会自动创建一个引用计数器,是系统用来判断是否回收对 ...
- iOS 学习笔记 九 (2015.04.02)IOS8中使用UIAlertController创建警告窗口
1.IOS8中使用UIAlertController创建警告窗口 #pragma mark - 只能在IOS8中使用的,警告窗口- (void)showOkayCancelAlert{ NSSt ...
随机推荐
- 【甘道夫】HBase(0.96以上版本号)过滤器Filter具体解释及实例代码
说明: 本文參考官方Ref Guide,Developer API和众多博客.并结合实測代码编写.具体总结HBase的Filter功能,并附上每类Filter的对应代码实现. 本文尽量遵从Ref Gu ...
- UOJ #148. 【NOIP2015】跳石头 二分
#148. [NOIP2015]跳石头 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/148 Descripti ...
- Codeforces Gym 100342C Problem C. Painting Cottages 暴力
Problem C. Painting CottagesTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1 ...
- mydumper原理5
前言 之前介绍了Oracle官方的多线程逻辑导入导出工具mysqlpump,但已经操作过的同学会发现其多线程的单位还是表,换句话说, 单表依然是 单线程导出 .网易早已使用mydumper/myloa ...
- Percona-Galera-Monitoring-Template监控模板说明
http://blog.chinaunix.net/uid-16844903-id-4054635.html 官网链接:http://www.percona.com/doc/percona-monit ...
- 把json格式对象转成可提交字符串格式,会过滤掉函数 {a: {b: 3}, b: [1], c: "d"} -> a.b=3&b[0]=1&c=d
var json = { name: "任务名称" , scoreRule: "", score: "", // 如果规则表达式不为空,则默 ...
- org.apache.hadoop.fs-BlockLocation
工具类吧 package org.apache.hadoop.fs; import org.apache.hadoop.io.*; //IO包下的类还没涉及到.遇到一个分析一个. import jav ...
- BootStrap2学习日记12---注册表单
<form method="" action="" class="form-horizontal"> <frameset& ...
- css笔记02:选择器(标签式和类)
body { margin:; padding:; background:#000 url('images/backgrounds/star.png') no-repeat fixed; font: ...
- Recovery启动流程(3)--recovery.cpp分析
转载请注明来源:cuixiaolei的技术博客 这篇文章主要通过分析高通recovery目录下的recovery.cpp源码,对recovery启动流程有一个宏观的了解.MTK和高通的recovery ...