美文网首页
iOS - viewDidUnload 被弃用

iOS - viewDidUnload 被弃用

作者: Mitchell | 来源:发表于2016-02-15 23:47 被阅读1373次

    为什么viewDidUnload 被弃用

    • iOS4 和 iOS5系统中,当内存不足,引用收到 MemoryWarning 时候,系统会自动调用当前界面上的 Viewontroller 的 viewDidUnload 方法,通常情况下,这些未显示咋界面上的 Controller 是 UINavigationController Push 栈中未在栈顶的 Controller,以及 UITabBarViewController 中未显示的子 ViewController,这些 Controller 都会在 MemoryWarning 事件发生的时候,让系统自动调用 viewDidUnload 方法。
    • 在 iOS6中,由于 viewDidunload 事件在任何情况下都不会被处罚,所以苹果在文档中建议,应该将回收内存的相关操作移到另一个回调函数 didReceiveMemoryWarning 中,但是如果你以为仅仅是把以前写到 ViewDidUnload 函数中的代码移动到 didReceiveMemoryWarning 函数中,那么就错了。
    • 在 iOS6以后的版本中不建议将 view 置为 nil 的原因如下:
      • UIView 有一个 CALayer 的成员变量,CALayer 是具体用于将自己滑到屏幕上的
      • CALayer 是一个 bitmap 图像的容器类,当 UIView 调用自身的 drawRect 时候,CALayer 才会创建这个 bitmap 图像类。
      • 具体占内存的其实是一个 bitmap 图像类,CALayer 只占48bytes,UIView 只占有96Bytes,而一个 iPad 的全屏 UIVIew 的 bitmap 类会占到12MB 的大小。
      • 在 iOS6中,当系统发出 MemoryWarning 时候,系统会自动回收 bitmap 类,但是不回收 UIView 和 CALayer 类,这样既能回收大部分内存,又能在需要 bitmap 类的时候,通过调用 UIView 的 drawRect:方法重建

    内存优化

    • 苹果对上面的内存回收做了一个优化:
      • 当一段内存被分配时候,他会被标记成“In use”,以防止被重复使用,当内存被释放的时候,这段内存会被标记成“Not in use”,这样,在有新的内存申请时,这块内存就可能被分配给其他变量。
      • CALayer 包括具体的 bitmap 内存的私有成员变量类型为 CABackStore,当收到 MemoryWarning 时候, CABackStore类型的内存区会被标记成 volatile 类型,volatile 表示,这块内存可能再次被元变量使用。
    • 这样,有了上面的优化之后,当收到 MemoryWarning 的时候,虽然所有的 CALayer 所包含的 bitmap 内存都被标记成 volatile 了,但是只要这块内存没有被复用,当需要重建 bitmap 内存时候,它就可以直接被复用,而避免了再次调用 UIView 的 drawRect: 方法。
    • 所以 ,简单来说,对于 iOS6,不需要做任何以前 viewDidUnload 做的事事情,更不需要把以前 viewDidUnload 的代码移动到 didReceiveMemoryWarning 方法中。

    相关文章

      网友评论

          本文标题:iOS - viewDidUnload 被弃用

          本文链接:https://www.haomeiwen.com/subject/wsppkttx.html