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 ...
随机推荐
- URAL 2047 Maths 打表 递推
MathsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action? ...
- QT5 串口收发实例代码
以下代码是自己测试门禁系统使用的 主要用到了串口的接收和发送 开发环境:xp QT5.1.1 串口:38400 N 8 1 自动检测可用串口 在xp上测试没问题 有些usb转串口会出现波特 ...
- Seconds_Behind_Master
http://blog.chinaunix.net/uid-28212952-id-3494560.html 今天同事遇到一个故障,xtrabackup备份中flush tables with rea ...
- PHP 正则表达式语法
则表达式简介 在某些应用中,往往有时候需要根据一定的规则来匹配(查找)确认一些字符串,如要求用户输入的 QQ 号码为数字且至少 5 位.用于描述这些规则的工具就是正则表达式. 最简单的匹配 最简单的匹 ...
- c语言全局变量
1.全局变量 #include <stdio.h> int L,n; void solve() { // printf("%d",L); printf("%d ...
- PHP.8-HTML+CSS(二)-HTML详解
HTML+CSS HTML参考手册[http://www.w3school.com.cn/tags/index.asp] 0.HTML主体标记 代码分为三部分编写 <html> 是网页文件 ...
- JavaScript与FileSystemObject
什么是FileSystemObject(简称FSO) FSO 即文件系统对象,是一种列表 Windows 磁盘目录和文件,对目录和文件进行删除.新建.复制.剪切.移动等操作的技术.使用 FSO 网站 ...
- NSBundle介绍及使用
bundle 是一个目录,其中包含了程序会使用到的资源.这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in).对应bundle, cocoa提供了类NSBu ...
- SRM 584 第一次玩TopCoder。。。只水题一道。。。
第一次topcoder,以前老感觉没有资格去做tc,cf什么的,现在已经慢慢接触了. 感觉还可以,还是有让我们这些蒻菜安慰的水题. tc的确很好玩,用客户端比赛,还有各种规则,而且还是只编写一个类提交 ...
- ruby 疑难点之—— attr_accessor attr_reader attr_writer
普通的实例变量 普通的实例变量,我们没法在 class 外面直接访问 #普通的实例变量,只能在 class 内部访问 class C1 def initialize(name) @name = nam ...