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]
相關文章
相關標籤/搜索