搜索

首页  >  问答  >  正文

iOS的viewDidUnload和dealloc有啥区别

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

大家讲道理大家讲道理2772 天前641

全部回复(3)我来回复

  • 迷茫

    迷茫2017-04-17 11:07:57

    这两个调用的场景是完全不一样的。
    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才有可能被释放。

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

    回复
    0
  • ringa_lee

    ringa_lee2017-04-17 11:07:57

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

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

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-17 11:07:57

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

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

    回复
    0
  • 取消回复