首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

viewDidUnload 跟 dealloc 的区别

2012-06-30 
viewDidUnload 和 dealloc 的区别对于iphone开发人员来说,内存管理是极为重要的技巧,哪怕程序的功能再强大

viewDidUnload 和 dealloc 的区别

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

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

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

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

?

;

?

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

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

个人拙见,不对之处还请提正!

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

?

热点排行