zoukankan      html  css  js  c++  java
  • iOS5  UIViewController  新特性

    http://wangjun.easymorse.com/?p=1630

    前言

    在苹果的WWDC2011大会视频的 《Session 101 - What’s New in Cocoa》《Session 102 - Implementing UIViewController Containment》 中介绍了苹果在iOS5中给UIViewController新增加的5方法以及一个属性:

    1
    2
    3
    4
    5
    6
    7
    8
    
    // 方法
    addChildViewController:
    removeFromParentViewController:
    transitionFromViewController:toViewController:duration:options:animations:completion:
    willMoveToParentViewController:
    didMoveToParentViewController:
    // 属性
    @property(nonatomic,readonly) NSArray *childViewControllers
    
    

    原来的问题

    这些新增的方法和属性用于改进我们的编程方式。那么让我们先看看以前的对于UIViewController的使用有什么潜在的问题,认清问题,我们才能理解苹果改变的意义。

    在以前,一个UIViewController的View可能有很多小的子view。这些子view很多时候被盖在最后,我们在最外层 ViewController的viewDidLoad方法中,用addSubview增加了大量的子view。这些子view大多数不会一直处于界面 上,只是在某些情况下才会出现,例如登陆失败的提示view,上传附件成功的提示view,网络失败的提示view等。但是虽然这些view很少出现,但 是我们却常常一直把它们放在内存中。另外,当收到内存警告时,我们只能自己手工把这些view从super view中去掉。

    改变

    苹果新的API增加了addChildViewController方法,并且希望我们在使用addSubview时,同时调用[self addChildViewController:child]方法将sub view对应的viewController也加到当前ViewController的管理中。对于那些当前暂时不需要显示的subview,只通过 addChildViewController把subViewController加进去。需要显示时再调用 transitionFromViewController:toViewController:duration:options:animations:completion 方法。

    另外,当收到系统的Memory Warning的时候,系统也会自动把当前没有显示的subview unload掉,以节省内存。

    参考资料

    关于这个,这儿有一篇不错的文章介绍了一段sample代码用于演示新API的使用.

    我也将其代码稍加修改,增加了view load, unload, appear, disappear的事件Log,以及收到Memory Warning时的Log。代码放在了github上,地址是这里,感兴趣的同学可以自己下载下来看看源码。

    可以看到,这些view在没有使用时,是不会被load的,并且当有Memory Warning时,当前没有显示的view自动被unload掉了。所以新的方法确实能有效地节省内存,也能方便地处理内存不足时的资源回收。运行Log如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    [7397:f803] -[FirstViewController willMoveToParentViewController:]
    [7397:f803] -[SecondViewController willMoveToParentViewController:]
    [7397:f803] -[ThirdViewController willMoveToParentViewController:]
    [7397:f803] -[ThirdViewController viewDidLoad]
    [7397:f803] -[ThirdViewController viewWillAppear:]
    [7397:f803] -[ThirdViewController viewDidAppear:]
    [7397:f803] 生日提醒
    [7397:f803] -[SecondViewController viewDidLoad]
    [7397:f803] -[ThirdViewController viewWillDisappear:]
    [7397:f803] -[SecondViewController viewWillAppear:]
    [7397:f803] -[SecondViewController viewDidAppear:]
    [7397:f803] -[ThirdViewController viewDidDisappear:]
    [7397:f803] 留言及回复
    [7397:f803] -[FirstViewController viewDidLoad]
    [7397:f803] -[SecondViewController viewWillDisappear:]
    [7397:f803] -[FirstViewController viewWillAppear:]
    [7397:f803] -[FirstViewController viewDidAppear:]
    [7397:f803] -[SecondViewController viewDidDisappear:]
    [7397:f803] Received memory warning.
    [7397:f803] -[SecondViewController viewDidUnload]
    [7397:f803] -[ThirdViewController viewDidUnload]
    
    
  • 相关阅读:
    PHP操作MongoDB GridFS 存储文件
    使用PHP来开发MongoDB并在shell查看数据
    MongoDB之PHP驱动安装配置
    MongoDB之GridFS存储文件
    laya 下以光标为中心缩放对象
    canvas 鼠标位置缩放图形
    gunicorn 基础配置使用
    keras 学习笔记:从头开始构建网络处理 mnist
    web 上读取图片,并转化为指定格式
    oracle 正则表达的使用
  • 原文地址:https://www.cnblogs.com/cnsec/p/11515831.html
Copyright © 2011-2022 走看看