在蘋果的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] |