IOS didReceiveMemoryWarning 的那些事

iOS的UIViewController 类给我们提供了处理内存不足的接口。

在iOS 3.0 之前,当系统的内存不足时,UIViewController的didReceiveMemoryWarining 方法会被调用,我们可以在didReceiveMemoryWarining 方法里释放掉部分暂时不用的资源。

从iOS3.0 开始,UIViewController增加了viewDidUnload方法。

该方法和viewDIdLoad相配对。

当系统内存不足时,首先UIViewController的didReceiveMemoryWarining 方法会被调用,而didReceiveMemoryWarining 会判断当前ViewController的view是否显示在window上,

如果没有显示在window上,则didReceiveMemoryWarining 会自动将viewcontroller 的view以及其所有子view全部销毁,然后调用viewcontroller的viewdidunload方法。

如果当前UIViewController的view显示在window上,则不销毁该viewcontroller的view,当然,viewDidunload也不会被调用了。

iOS3-iOS5.0以前版本收到内存警告:

调用didReceiveMemoryWarning内调用super的didReceiveMemoryWarning会将controller的view进行释放。所以我们不能将controller的view再次释放。

处理方法:

Java代码  

  1. -(void)didReceiveMemoryWarning
  2. {
  3. [super didReceiveMemoryWarning];//如没有显示在window上,会自动将self.view释放。
  4. // ios6.0以前,不用在此做处理,self.view释放之后,会调用下面的viewDidUnload函数,在viewDidUnload函数中做处理就可以了。
  5. }
  6. -(void)viewDidUnload
  7. {
  8. // Release any retained subviews of the main view.不包含self.view
  9. //处理一些内存和资源问题。
  10. [super viewDidUnload];
  11. }

但是到了ios6.0之后,这里又有所变化,ios6.0内存警告的viewDidUnload 被屏蔽,即又回到了ios3.0的时期的内存管理方式。

iOS6.0及以上版本的内存警告:

调用didReceiveMemoryWarning内调用super的didReceiveMemoryWarning调只是释放controller的resouse,不会释放view

处理方法:

-(void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];//即使没有显示在window上,也不会自动的将self.view释放。

// 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函数。

}

}

}

根据网上的的翻译理解是这样的.一般不是官方的说法本人都会保留怀疑的态度.然后找到了官方的链接.

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html

时间: 2024-10-18 00:21:23

IOS didReceiveMemoryWarning 的那些事的相关文章

iOS 统计打点那些事

1.统计代码埋点 so easy? 统计打点是 App 开发里很重要的一个环节,App 的运行状态.改版后的效果.用户的各种行为等都需要打点,市面上也有不少可供选择的第三方库. 假设产品有这么个需求:当用户在详情页点击购买按钮时,记录一下事件.我们实现起来大概会是这样 // DetailViewController.m - (void)onBuyButtonTapped:(UIButton *)button {     // do some stuff, maybe send a request

iOS App开发那些事:如何选择合适的人、规范和框架?

自从做Team Leader之后,身上权责发生了变化,于是让我烦恼的不再是具体某个功能,某个界面的实现,而是如何在现有代码的基础上做渐进式的改进,创造出比较合适规范和框架,使得组内成员更快更好地完成任务.一年下来,颇有点想法,于是啰嗦几句关于iOS App开发的那些事. 合适的人 首先明确一点,合适的人是指纯技术团队的建设.一支战斗力再强的技术团队,面对一个朝三暮四,分分钟推翻自己原有想法的产品经理/项目经理,再好的戏也唱不出来.花几个月加班加点做项目,还没发布,直接推翻重做,这时候你就得去楼下

学习IOS需要知道的事

什么是iOS iOS是一款由苹果公司开发的操作系统(OS是Operating System的简称),就像平时在电脑上用的Windows XP.Windows 7,都是操作系统 那什么是操作系统呢?操作系统其实是一种软件,是直接运行在硬件(电脑.手机等)上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行. 按照运行系统的设备进行分类,可分为:电脑操作系统.手机操作系统. iOS与Win7等操作系统的差异 XP.Win7是PC操作系统,也就是运行在电脑上的操作系统 iOS是手持设备操

iOS开发的一些事

1.+(void)load 和 +(id)inittialize的区别 +load是在一个类最开始加载时调用,+initialize是在应用中第一次调用该类或它的实例的方式之前调用.这两个方法都是可选的,只有实现了才会被执行.+load能够保证在类初始化的时候就会被加载,这为改变系统行为提供了一些统一性.但+initialize并不能保证在什么时候被调用——甚至也有可能永远也不会被调用,例如应用程序从未直接的给该类发送消息. 2.UIView和CALayer UIView是iOS系统中界面元素的

关于iOS设备的那些事

首先推荐一个在用的库XYQuick 地址:https://github.com/uxyheaven/XYQuick idfa: 获取方式 [ASIdentifierManager sharedManager].advertisingIdentifier.UUIDString 每个设备只有一个IDFA,不同APP在同一设备上获取IDFA的结果是一样的 设备重启不会产生新的IDFA 但IDFA存在重新生成的情况: 用户完全重置系统(设置程序 -> 通用 -> 还原 -> 还原位置与隐私) 用

iOS架构-UINavigationController那些事

1. UINavigationController提供的功能 导航控制器提供在不同页面之间的导航功能, 包括: push back. 统一的导航栏. 导航的手势(侧滑后退) 统一的工具栏 导航控制器 导航控制器维护一个堆栈结构. 一层一层. 入栈操作对应push, 但是不会销毁之底部的控制器 出栈操作对应back, 会销毁顶部的控制器(减少一个引用, 如果你想保留也可以) back操作会很快, 因为不需要创建和加载视图.

ios--NSCalendar NSDateComponents

原文: ios时间那点事--NSCalendar NSDateComponents http://my.oschina.net/yongbin45/blog/156181 目录[-] iOS时间那点事 NSCalendar + NSDateComponents NSDateComponents实例化的方式 第一种: 第二种: 第三种: NSCalendar中比较重要的方法和概念 firstWeekday -(NSRange)rangeOfUnit:(NSCalendarUnit)smaller

NSCalendar NSDateComponents

目录[-] iOS时间那点事 NSCalendar + NSDateComponents NSDateComponents实例化的方式 第一种: 第二种: 第三种: NSCalendar中比较重要的方法和概念 firstWeekday -(NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date; 答疑解惑: -(NSUInteger)ordinalityOfU

Fiddler代理手机抓包

Fiddler代理手机抓包 0. 安装Fiddler 1. 安装HTTPS证书并允许远程连接 Tools - Options 点击OK后重启Fiddler. 确保手机与当前电脑在同一局域网. 然后在手机WLAN设置中找到[代理设置],设置代理为[手动],地址:192.168.1.100(这里是自己电脑的IP),端口:8899(可以自定其他不被占用端口).点击保存.Andriod和iOS应该差不多. 然后在手机浏览器打开 192.168.1.100:8899(你自己电脑的ip 截图只是示例),出现