对于iphone开发人员来说,内存管理是极为重要的技巧,哪怕程序的功能再强大,设计再漂亮,如果内存控制不好,也难逃程序莫名退出的噩运,这与网页开发是完全不同的。

内存控制里面有很多门道,在这里分析一下 viewDidUnload 和 dealloc 的区别,关于这两者的区别的文章很多,但是大都是摘抄和翻译官方文档,有的也只是简单的说两句,并没有详细说出两者具体的区别。

在了解两者之间的区别,首先要知道 view 的生命周期,google 里面有很多文章,可以先去搜一下,这里就不详解了。

顾名思义  viewDidUnload 就是当 view 被卸载以后执行的语句,它与 viewDidLoad 是相互呼应的。大家都知道官方的解释是执行类似

self.myOutlet = nil;

的命令,但是为什么这么干,什么时候调用这个方法呢?

这个方法是不能手动调用的,它实际上是当应用程序接收到手机内存警告的时候自动调用的方法,目的就是清空内存除当前 viewController 以外所有已经加载过的 viewController 里面的暂时不再使用的一些控件或数据,以避免应用程序应消耗内存过多被强制关闭。记住,是除当前正在展示的 view 所属 viewController 以外所有已经在内存里面的 viewController 执行 viewDidUnload 方法,而不是当前 viewController 执行 viewDidUnload,当然,这些 viewController 不会被 dealloc。所以在 viewDidUnload 里面一般都是释放 IBOutlet 变量和在 viewDidLoad、viewWillAppear、viewDidAppear 等方法能够重建的数据。而由其他页面传递过来的数据或者无法经过 viewDidLoad、viewWillAppear、viewDidAppear 等方法重建的数据则不能释放,举例子说如果在 navigationController 由上一个页面传递过来的一张图片,在 viewDidUnload 里被释放的话,则当 view 再次加载的时候就无法恢复了。

那为什么要写成 self.myOutlet = nil; ,实际上这个语法是执行了 property 里的setter 方法,而不是一个简单的变量赋值,它干了两件事:1、老数据 release 掉,2、新数据(nil)retain(当 property 设置为 retain 的情况下),当然对 nil retain 是无意义的。如果写成 myOutlet = nil,那就是简单的把 myOutlet 指向 nil,这样内存就泄漏了,因为老数据没有 release。而如果仅仅写成 [myOutlet release] 也会有问题,因为当 view 被 dealloc 的时候会 再次 release,程序就出错了,而对 nil release 是没有问题的。
 
dealloc 是当前 viewController 被释放的时候,清空所有当前 viewController 里面的实体和数据来释放内存,该方法也是自动调用的,无需手动执行。举例说明当 modalView 被 dismissModalViewControllerAnimated 或者 navigationController 回到上一页的时候,这个方法就会被自动调用。因为这个页面已经不再使用了,所以可以把所有实体和数据都释放(release)掉。

其实两者最大的区别就是: viewDidUnload 是内存除当前以外所有 viewController 同时执行,而 dealloc 只是当前 viewController 执行。这个是网上的材料没有说明的。

正如网上说viewDidUnload可以释放一些容易重新构建的东西,比如本地的图片之类的,当然在viewDidLoad里必须重新构建。

而对于不易重新构建的东西,如重新从服务器下载的数据,则可以放在init里构建,viewDidUnload就不要将其释放了。

PS: 很多朋友都说无法调试 viewDidUnload,其实是可以的。方法是在 iOS 模拟器的菜单里选 硬件 -> 模拟内存警告,这个时候就可以看到 viewDidUnload 里面 NSLog 的东西了,可以试试在打开过的 viewController 里都 NSLog 一下看看效果。而 dealloc 里面可以直接 NSLog。

转自:http://www.cnblogs.com/zhwl/archive/2012/06/06/2538494.html

转载于:https://www.cnblogs.com/superchao8/archive/2012/09/18/2690586.html

viewDidUnload 和 dealloc 的区别相关推荐

  1. 由init、loadView、viewDidLoad、viewDidUnload、dealloc的关系说起

    由init.loadView.viewDidLoad.viewDidUnload.dealloc的关系说起 init方法 在init方法中实例化必要的对象(遵从LazyLoad思想) ‍init方法中 ...

  2. UIView的一些基本方法 init、loadView、viewDidLoad、viewDidUnload、dealloc

    init方法 在init方法中实例化必要的对象(遵从LazyLoad思想) ‍init方法中初始化ViewController本身 loadView方法 当view需要被展示而它却是nil时,view ...

  3. ios实例开发精品文章推荐(8.14)

    1.iOS源码:俄罗斯方块 实现简单的俄罗斯方块游戏. <ignore_js_op> 下载地址:http://www.apkbus.com/android-124628-1-1.html ...

  4. loadView 和 viewDidLoad、viewDidunload 的区别

    loadView 和 viewDidLoad 是 iPhone 开发中肯定要用到的两个方法. 他们都可以用来在视图载入的时候初始化一些内容. 但是他们有什么区别呢? viewDidLoad 方法只有当 ...

  5. 长路漫漫,唯剑作伴--loadView、viewDidLoad及viewDidUnload的关系

    一.loadView 什么时候被调用? 每次访问UIViewController的view(比如controller.view.self.view)而且view为nil,loadView方法就会被调用 ...

  6. loadView、viewDidLoad及viewDidUnload的关系

    标题中所说的3个方法,都是UIViewController的方法,跟UIViewController的view属性的生命周期息息相关.接下来我会一一阐述它们的作用以及它们之间的联系. 一.loadVi ...

  7. loadView、viewDidLoad及viewDidUnload的关系(李明杰老师)

    本文目录 一.loadView 二.viewDidLoad 三.viewDidUnload 四.三个方法的关系 标题中所说的3个方法,都是UIViewController的方法,跟UIViewCont ...

  8. iOS核心动画高级技术(十四) 图像IO

    The idea of latency is worth thinking about. 潜伏期值得思考 - 凯文 帕萨特 在第13章"高效绘图"中,我们研究了和Core Grap ...

  9. UIViewController与UIView的关系

    haoxue 2010-11-21 21:30 iphone--UIViewController与UIView的关系 UIView翻转效果实现 新建一个view-based模板工程,在ViewCont ...

最新文章

  1. var java_var 是 Java 开发的好朋友啊!
  2. [Winform]检测exe是否已经运行,并将其置顶
  3. python3各版本区别-Python2 与Python3的版本区别实例分析
  4. 频繁弹出“受到网络攻击”的消息怎么办,五分钟看懂“僵尸网络”攻击
  5. Springboot整合redis(lettuce)
  6. CentOS7 Zabbix3.4安装
  7. 线上日志分析与其他一些脚本
  8. 2019蓝桥杯省赛---java---C---2(矩阵切割)
  9. fiddler如何filter_Fiddler工具的过滤功能介绍
  10. vue保存图片到手机相册_手机照片误删了怎么找回?这三个方法轻松搞定,亲测有效...
  11. 使用waitgroup控制协程退出
  12. jinja Macros
  13. Xcode升级后插件失效
  14. docker 安装 Redis5.X
  15. mac touchbar 自定义
  16. 震旦adc225打印机连接计算机,震旦adc225驱动
  17. 机器学习(2)——监督学习
  18. 卫星导航定位误差之多路径地球自转相位缠绕相位中心误差地球潮汐
  19. 手把手教你做短视频去水印微信小程序(2-首页)
  20. 华为路由器负载均衡_华为路由器配置利用NAT实现TCP负载均衡

热门文章

  1. 如何实现一个malloc
  2. 华为交换机vlan与trunk配置
  3. 并发编程(四)__ConcurrentHashMap
  4. Binary Tree Maximum Path Sum
  5. Linux基础命令的操作(时间与日期,日历,计算器)
  6. Devexpress TreeList控件绑定显示父子节点对像
  7. BackTrack5 R2快速更新至BackTrack5 R3
  8. 还原sql server数据库时,无法获得对数据库的独占访问权
  9. PHP之高性能I/O框架:Libevent(二)
  10. Realm数据库存储 使用详解