UIView的生命周期
UIView對象一般都是由alloc和init方法創建的,由UIViewController進行維護和管理。一般需要完成的任務有:創建視圖,顯示視圖,隱藏視圖和釋放視圖。
一般視圖不會在程序運行時立刻創建并載入,只有當應用需要這個視圖的時候才會創建,這種延遲創建視圖的方法能夠提高內存的使用效率。同樣,在需要這個視圖之前,系統會檢查是不是已經載入過這個視圖,如果是,直接返回創建過的view,如果沒有,則開始創建過程
- (void)loadView
載入視圖過程中執行代碼
- (void)viewDidLoad
視圖載入完成需要執行的代碼
- (void)viewDidUnload
卸載視圖代碼
一個視圖切換到另一個視圖的時候,之前那個視圖并不會被清除,還會留在內存中等待系統調用,所以一個視圖在使用到卸載過程中雖然可能多次出現,但是只會載入一次,也就是調用一次loadView和viewDidLoad方法。
在IOS6以前,在系統接收到Memory Warning時,會調用viewDidUnload這個方法,對視圖進行卸載清空。但是IOS6以后這個方法已經不再被使用了,文檔里是這么描述的
這里給出的解釋是,視圖不再在低內存的情況下被清除了。蘋果公司WWDC2012對這個方法的告別陳述
The method viewWillUnload and viewDidUnload. We’re not going to call them anymore. I mean, there’s kind of a cost-benifit equation and analysis that we went through. In the early days, there was a real performance need for us to ensure that on memory warnings we unloaded views. There was all kinds of graphics and backing stores and so forth that would also get unloaded. We now unload those independently of the view, so it isn’t that big of a deal for us for those to be unloaded, and there were so many bugs where there would be pointers into。
具體為什么不需要清空view呢,下面解釋了原因(摘自唐巧的《再見,viewDidUnload方法》)
1.UIView有一個CALayer的成員變量,CALayer是具體用于將自己畫到屏幕上的。如下圖所示:
2.CALayer是一個bitmap圖象的容器類,當UIView調用自身的drawRect時,CALayer才會創建這個bitmap圖象類。
3.具體占內存的其實是一個bitmap圖象類,CALayer只占48bytes, UIView只占96bytes。而一個iPad的全屏UIView的bitmap類會占到12M的大小!
4.在iOS6時,當系統發出MemoryWarning時,系統會自動回收bitmap類。但是不回收UIView和CALayer類。這樣即回收了大部分內存,又能在需要bitmap類時,通過調用UIView的drawRect: 方法重建。
所以蘋果才會說現在會卸載那些真正占內存的獨立內容,卸載UIView對象已經并不重要了。
另外,在每次視圖顯示和隱藏的過程中還會調用一些方法
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
寫入在每次顯示視圖和隱藏視圖時的代碼塊。
重要的是:視圖控制對象和視圖是兩個獨立的對象,Controller要借助View才能和用戶進行交互,可以把視圖看成一種可再生資源,可以創建,卸載(從前),可以顯示,隱藏。
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的UIView的生命周期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 崩坏3理之律者厉害吗
- 下一篇: 香港上市条件及流程