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 ...
随机推荐
- PostgreSQL中,如何查表属于哪个数据库
db1=# \x Expanded display is on. db1=# SELECT * FROM information_schema.tables WHERE table_name='tab ...
- SQL Server活动监视器
打开SQL Server活动监视器:
- 从零开始学android开发-setBackgroundDrawable与setBackgroundResource的区别
setBackgroundDrawable和setBackgroundResource的区别很多网友不知道View类提供的setBackgroundDrawable和setBackgroundReso ...
- Educational Codeforces Round 2 C. Make Palindrome 贪心
C. Make Palindrome Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/600/pr ...
- Python小工具--删除svn文件
有的时候我们需要删除项目下的svn相关文件,但是SVN会在所有的目录下都创建隐藏文件.svn,手工一个个目录查找然后删除显然比较麻烦.所以这里提供了一个Python小工具用于批量删除svn的相关文件: ...
- Linux内核加载全流程
无论是Linux还是Windows,在加电后的第一步都是先运行BIOS(Basic Input/Output System)程序——不知道是不是所以的电脑系统都是如此.BIOS保存在主板上的一个non ...
- Explain的type, where 和 order by 组合是索引的选择
Explain的type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是: system > const > eq_ref > ref > fulltext > ...
- iOS 8 CloudKit上手教程
CloudKit,是苹果最新推出的基于iCloud的一个云端数据存储服务,提供了低成本的云存储并能作为一个后端服务通过用户们的iCloud账号分享其应用数据. CloudKit主要由两个部分组成: 一 ...
- 自定义JPA之AttributeConverter
1. 执行类 public class BooleanConverter implements AttributeConverter<Boolean, Integer> { } 2. 属性 ...
- Content-Type一览
文件扩展名 Content-Type(Mime-Type) 文件扩展名 Content-Type(Mime-Type) .*( 二进制流,不知道下载文件类型) application/octet-st ...