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 ...
随机推荐
- 教你50招提升ASP.NET性能(十八):在处理网站性能问题前,首先验证问题是否出在客户端
(29)Before tackling any website performance issue, first verify the problem isn’t on the client 招数29 ...
- java中匿名类的讲解
匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象 ...
- mvc4 web-api 与unity搭建接口
对于接口重要的应该是 功能实现,合法性验证,性能监控,日志等模块 通过unity aop功能可以实现统一的日志模块和性能监控. 1.新建mvc4 webapi项目 nuget添加 unity 3.0+ ...
- 理解extern
extern有两层含义:表示声明和extern C 1.C++分为编译期和运行期,C++是分别单独编译,编译期可认为有三个步骤:a.预编译进行文本替换,将源文件(cpp文件)生成编译单元:b.编译单元 ...
- codeforces 468B 2-sat
今天明确了2-SAT; 表示对一对整数之间的关系是否存在 #include<cstdio> #include<algorithm> #include<iostream&g ...
- 利用ajax获取到的网页源码不能执行js代码
今天觉得我的博客中加载腾讯微博的速度很慢,所以就想改写为js,本来以为直接新建一个页面,把获取函数移到新的页面中,原来的页面只要使用xmlhttp去GET一下,然后把div的innerhtml属性等于 ...
- [AngularJS] Provider
This lesson describes what is really happening when you use the angularfactory and how you can make ...
- iOS开发——实用篇Swift篇&项目开发常用实用技术
项目开发常用实用技术 实现拨打电话 要实现打电话功能,最简单最直接的方式便是:直接跳到拨号界面 (注意:这个需要真机调试,模拟器无效果) UIApplication.sharedApplica ...
- Centos 6.5使用Bumblebee关闭N卡,冷却你的电脑
夏天来了,笔记本装的Centos一直非常热.随着天气的变化,这个问题真的要攻克了.差了下原因可能是双显卡笔记本,N卡驱动不完好,导致风扇狂叫. 昨天安装了nvidia 的显卡驱动本以为时间安静了.但是 ...
- Key Task
Problem Description The Czech Technical University is rather old - you already know that it celebrat ...