转自:http://blog.csdn.net/chun799/article/details/8951694

在iOS6中,viewDidUnload回调方法被Deprecated掉了。查看苹果的文档,可以看到如下的说明。

那么,原本在viewDidUnload中的代码应该怎么处理?在iOS6中,又应该怎么处理内存警告?带着这些问题,我查找了一些资料,在此分享给大家。

分析

在iOS4和iOS5系统中,当内存不足,应用收到Memory warning时,系统会自动调用当前没在界面上的ViewController的viewDidUnload方法。 通常情况下,这些未显示在界面上的ViewController是UINavigationController Push栈中未在栈顶的ViewController,以及UITabBarViewController中未显示的子ViewController。这些View Controller都会在Memory Warning事件发生时,被系统自动调用viewDidUnload方法。

在iOS6中,由于viewDidUnload事件在iOS6下任何情况都不会被触发,所以苹果在文档中建议,应该将回收内存的相关操作移到另一个回调函数:didReceiveMemoryWarning 中。但是如果你仅仅是把以前写到viewDidUnload函数中的代码移动到didReceiveMemoryWarning函数中,那么你就错了。以下是一个 错误的示例代码 :

- (void)didReceiveMemoryWarning {  [super didReceiveMemoryWarning];  if([self isViewLoaded] && ![[self view] window]) {  [self setView:nil];  }

这篇文章解释了iOS6不推荐你将view置为nil的原因(链接打开需要FQ), 翻译过来如下:

UIView有一个CALayer的成员变量,CALayer是具体用于将自己画到屏幕上的。如下图所示:

CALayer是一个bitmap图象的容器类,当UIView调用自身的drawRect时,CALayer才会创建这个bitmap图象类。

具体占内存的其实是一个bitmap图象类,CALayer只占48bytes, UIView只占96bytes。而一个iPad的全屏UIView的bitmap类会占到12M的大小!

在iOS6时,当系统发出MemoryWarning时,系统会自动回收bitmap类。但是不回收UIView和CALayer类。这样即回收了大部分内存,又能在需要bitmap类时,通过调用UIView的drawRect: 方法重建。

内存优化

另外文章中还提到苹果的操作系统对此做的一个内存优化技巧,解释如下:

当一段内存被分配时,它会被标记成“In use“, 以防止被重复使用。当内存被释放时,这段内存会被标记成”Not inuse”,这样,在有新的内存申请时,这块内存就可能被分配给其它变量。

CALayer包括的具体的bitmap内容的私有成员变量类型为CABackingStore, 当收到MemroyWarning时,CABackingStore类型的内存区会被标记成volatile类型(这里的volatile和 C以及Java语言的volatile不是一个意思),volatile表示,这块内存可能被再次被原变量重用。

这样,有了上面的优化后,当收到Memoy Warning时,虽然所有的CALayer所包含的bitmap内存都被标记成volatile了,但是只要这块内存没有再次被复用,那么当需要重建bitmap内存时, 它就可以直接被复用,而避免了再次调用 UIView的 drawRect: 方法。

总结

所以,简单来说,对于iOS6,你不需要做任何以前viewDidUnload的事情,更不需要把以前viewDidUnload的代码移动到 didReceiveMemoryWarning方法中。

引用WWDC 2012 中的一段话来给viewDidUnload说再见:

The method viewWillUnload and viewDidUnload. We’re not going to call them anymore. I mean, there’s kind of a cost-benifit equation and analysis that we went through. In the early days, there was a real performance need for us to ensure that on memory warnings we unloaded views. There was all kinds of graphics and backing stores and so forth that would also get unloaded. We now unload those independently of the view, so it isn’t that big of a deal for us for those to be unloaded, and there were so many bugs where there would be pointers into。

iOS viewDidUnload方法相关推荐

  1. CISCO路由器IOS升级方法

    前不久,朋友在对一台带语音模快的CISCO2610进行IOS升级时,由于路由器的内存(flash)为8M,IOS软件为7M多,升级后路由器无法正常启动.启动后到rommon 1 >状态,请求帮助 ...

  2. Cisco路由器IOS升级方法总结

    Cisco路由器IOS升级方法总结 笔者长期从事计算机网络管理工作,在对CISCO路由器的长期日常维护和管理实践中积累了一定的经验.现总结归纳出CISCO路由器 IOS 映像升级的几种方法,供广大网络 ...

  3. js怎么调用ios的方法(原网址:https://www.jianshu.com/p/ce5e8c2f6d2e或者https://tech.youzan.com/jsbridge/)

    网页(js)与oc(iOS)之间的方法调用及传值 清都 关注 2017.07.27 15:36* 字数 363 阅读 110评论 0喜欢 0 最后更新时间:2017-07-27 调用的对象bsg只是一 ...

  4. js调用ios的方法

    摘要 在做h5应用的时,有时有些功能js并不能实现的特别完美.比如下载进度条或上传文件进度等.如果能调用ios或者android的方法,实现进度,以及文件上传或者下载列表更好一些.如果使用第三方的js ...

  5. 在ROMMON状态下恢复IOS的方法

    对于网络工程师来说,不小心把IOS删掉或者升级IOS失败,重起后进ROMMON(ROMMON状态是ROM MONITOR的缩写)状态,是比较常见的事.路由器进入ROMMON状态,不能进行正常的路由转发 ...

  6. 思科tar格式IOS升级方法

    这篇文档是关于cisco交换机升级的命令用法,用于升级.tar格式的IOS,里面包含HTTP管理用到的文件. 建议大家升级交换机都用此命令吧,包括路由器升级带SDM或CCME等等,此文的出处实在是查询 ...

  7. h5调用Android、ios的方法

    头一次尝试调用,原理还没懂 function app_rtn(msg, data) {// $("#container").prepend($("<span> ...

  8. 交换机tftp服务器修改ip,CISCO 3560 交换机IOS升级方法(TFTP)

    CISCO 3560 交换机IOS升级 一.设备清单 CICSO 3560交换机,安装了超级终端的PC,TFTP或FTP服务器,c3560-advipservicesk9-mz.122- 25.SEE ...

  9. IOS 传值方法总结

    1.属性传值 前向后传值. 2.协议传值 http://liuyafang.blog.51cto.com/8837978/1549391 3.Block传值 代替协议代理传值,主要时间点问题. htt ...

最新文章

  1. onvif规范的实现:onvif开发常用调试方法 和常见的segmentation fault错误
  2. Web 数据存储总结
  3. python socket代码_python入门之socket代码练习
  4. 1024程序员节获奖通知
  5. Hibernate性能提升
  6. 最新17个紫色风格网页设计作品欣赏
  7. java 使用本机代理_Java与本机代理–他们所做的强大功能
  8. 2020年最快的dns_2020年哪里换旅行证最快取证?需要几天?
  9. mysql中主从复制配置文件_MySQL主从复制 配置文件实例
  10. rsync同步服务部署
  11. rsyslog官方文档
  12. 常见debug指令和使用
  13. SPSS中有关相关性分析的介绍(双变量相关分析、偏相关)
  14. xtrabackup备份mysql实战_Xtrabackup备份mysql实战(做从库全过程)
  15. 追赶法求解线性方程组matlab,追赶法求解三对角线性方程组Matlab编程
  16. C#winform之自定义按钮形状
  17. 微信小程序 -- 真机调试时没问题,上线后无法访问服务器
  18. 百度地图3d效果和卫星图效果
  19. php反序列化--字符串逃逸
  20. 盖世帝尊 I 分享(一叶青天)

热门文章

  1. 中国产业园区发展动态及前景趋势规划建议报告2022-2028年版
  2. 中国黄金行业投资需求与收益预测报告2022年版
  3. 忘记农民就是忘本-农业大健康·万祥军:不要说自己是教授
  4. Win server 2012 R2 文件服务器--(三)配额限制
  5. day15-pymysql模块的使用
  6. 20172329 2017-2018-2 《程序设计与数据结构》实验四报告
  7. Jumping Jack
  8. HDU 1561 The more, The Better (树形DP,常规)
  9. 在eclipse下配置maven插件
  10. DIV+CSS布局,第五课,DOCTYPE的选择,零起点细说网站制作