首页 > iOS的viewDidUnload和dealloc有啥区别

iOS的viewDidUnload和dealloc有啥区别

这两个方法里都要释放对象,那在哪里释放有什么区别呢?
如果我把所有的资源都放在dealloc里释放会出什么问题么?
都放在viewDidUnload里呢?


viewDidUnload 是UI中 view 被切换出去的回调函数.
dealloc 是对象的应用数降为0时, 释放内存.

如果说 view 对象后面还会重用, 把资源释放写在 dealloc 里就可以了.


这两个调用的场景是完全不一样的。
1)viewDidUnload只有在收到内存警告后,controller连着的主View被释放了才会调用。
2)而dealloc则是Controller释放的时候调用的,当然这个时候连着它的View也会被释放,但是这个时候是不会调用viewDidUnload的。

所以说,ViewDidUnload其实在一个contorller的生命周期中有可能被调用多次,也有可能一次都不调用。那么它里面应该释放的东西主要是要跟viewDidLoad对应起来。比如你在viewDidLoad中在给主view add了一个子view,那么如果你不在viewDidUnload中去remove这个子View,就会造成第二次viewDidLoad的时候又加了一个View上去。主要是特别要注意这类问题。

还要注意一点,如果是和数据、view的一些状态相关的东西,你不能在viewDidUnload中去释放它,这样会导致当View再次加载进来的时候就跟之前的不一样了。

对于具体的调试,你可以在模拟器中触发内存警告来触发viewDidUnload。不过要注意的是不能是当前最上面的controller。因为只有是没有显示在主屏幕上的view才有可能被释放。

有点啰嗦。想到什么写什么了。


我觉得你可以换个角度来看,比如initviewDidLoad,当你创建一个Controller的时候就会调用init,但是只有你把controller放到window上显示的时候才会调用viewDidLoad

同样,当controller不再显示,并且内存不够的时候,系统可能会调用其viewDidUnload,这个时候对象并不会dealloc,只不过再次显示的时候会重新viewDidLoad一遍

【热门文章】
【热门文章】