iOS5 中 UIViewController 的新方法

前言

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

//方法
 addChildViewController: 
removeFromParentViewController: 
transitionFromViewController:toViewController:duration:options:animations:completion: 
willMoveToParentViewController: 
didMoveToParentViewController: 
// 属性 
@property(nonatomic,readonly) NSArray *childViewControllers

原来的问题 github

这些新增的方法和属性用于改进咱们的编程方式。那么让咱们先看看之前的对于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方法。 app

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

参考资料

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

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

能够看到,这些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]
相关文章
相关标签/搜索