iOS5中UIViewController的新方法

时间:2023-01-29 13:14:50
  1. iOS5中UIViewController的新方法

前言

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

// 方法
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 如下:

[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]

iOS5中UIViewController的新方法的更多相关文章

  1. ES6中数组的新方法

    数组的扩展 1.1扩展运算符 1.1.1:... 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. <body> < ...

  2. javaScript中 数组的新方法(reduce)

    定义和用法 reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值. reduce() 可以作为一个高阶函数,用于函数的 compose. 注意: redu ...

  3. 字符串的新方法——includes&lpar;&rpar; padStart&lpar;&rpar; padEnd&lpar;&rpar;

    ES6为字符串提供了一个新方法,叫做String.prototype.includes('要包含的字符串'),如果包含,则返回字符串,否则返回false 使用ES6中的字符串新方法String.pro ...

  4. UIViewController新方法的使用&lpar;transitionFromViewController&colon;toViewController&colon;duration&colon;options&colon;animations&colon;completion&colon;&rpar;

    iOS5中,UIViewController新添加了几个方法: - (void)addChildViewController:(UIViewController *)childController N ...

  5. 将dll文件注入到其他进程中的一种新方法

    http://www.45it.com/windowszh/201212/33946.htm http://www.hx95.cn/Article/OS/201212/65095.html 我们知道将 ...

  6. SQL Server中解决死锁的新方法介绍

    SQL Server中解决死锁的新方法介绍 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的 ...

  7. ES5中新增的forEach等新方法的一些使用声明

    转载地址:http://www.zhangxinxu.com/wordpress/?p=3220 一.前言-索引 ES5中新增的不少东西,了解之对我们写JavaScript会有不少帮助,比如数组这块, ...

  8. 在HTML页面中实时获取新消息的方法 &OpenCurlyDoubleQuote;JavaScript中的setInterval用法”

    JavaScript中的setInterval用法(资料来源:博主---八神吻你   ) setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象.可以使用本动作更新来自数 ...

  9. Vue中遍历数组的新方法

    1.foreach foreach循环对不能使用return来停止循环 search(keyword){ var newList = [] this.urls.forEach(item =>{ ...

随机推荐

  1. csharp&colon; Download SVN source

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. angularJS 学习演示

    开源网址(带中文说明注释):https://github.com/EnhWeb/angularJS.git

  3. 7 天玩转 ASP&period;NET MVC — 第 7 天

    目录 第 1 天 第 2 天 第 3 天 第 4 天 第 5 天 第 6 天 第 7 天 0. 前言 今天是开心的一天.因为我们终于来到了系列学习的最后一节.我相信你喜欢之前的课程,并从中学到了许多. ...

  4. poj 2454 Jersey Politics 随机化

    随机化算法+贪心! 将3*k排序后分成3分,将第二第三份的和分别加起来,让和与500*k比较,都大于则输出,否则,随机生成2个数,在第二第三份中交换! 代码如下: #include<iostre ...

  5. ASP&period;NET - TreeView

    设置节点图片 : Windows资源管理器左侧的树型资源结构图中,各节点都有图片连接,例如磁盘的图片.光盘的图片和文件夹的图片等,使资源的表现更加形象.IEWebControls的TreeView控件 ...

  6. 快速上手使用Maven

    maven的相关命令 mvn archetype:create :创建 Maven 项目 mvn compile :编译源代码(编译到target文件夹中) mvn test-compile :编译测 ...

  7. 如何学习 MFC ?

    //std::string => CString std::string srcString = "Hello World!"; CString dstString = CS ...

  8. 用DirectShow实现视频采集-流程构建

    DirectShow作为DirectX的一个子集,它为用户提供了强大.方便的多媒体开接口,并且它拥有直接操作硬件的能力,这使得它的效率远胜于用GDI等图形方式编写的多媒体程序.前面一篇文章已经对Dir ...

  9. mysql修改当前用户的密码

    ALTER USER USER() IDENTIFIED BY '123456';https://majing.io/posts/10000005531181

  10. Abp&period;Linq&period;Extensions扩展&lpar;1&rpar;--static class QueryableExtensions

    // 摘要:        //     Used for paging with an Abp.Application.Services.Dto.IPagedResultRequest object ...