#系列:iOS開發-VC生命週期git
做爲一個開發人員,咱們寫應用的時候,說白了無非就是寫一個個界面,經過各個界面的建立,切換,銷燬等,產生應用所謂的交互,固然有的數據是全局的,跟界面的存在無關,例如你在播放的一首歌,這首歌不管你是否在某個界面,它都會持續的播放下去,想一想怎麼寫?是的這個播放器寫成單例... 固然,有的數據就是依賴於界面而存在,好比某些歌單列表,當咱們寫一個列表頁,並展現的時候我就會去請求列表數據,當咱們不須要列表頁的時候,那麼這個數據也會跟着頁面銷燬. 因此說,一個vc的生命週期相當重要,咱們在開發的時候, 不可以簡單的只關注push和pop等結果,咱們仍要關注這些動做的整個流程, 一個vc的生命從無到有,在從有到無是如何發展的,只有熟悉了這些流程,咱們在開發的時候才能真正的作到把須要的代碼寫到須要的地方, 例如咱們會在建立視圖的時候同時請求網絡數據,刷新表格,及時的讓用戶看到所想要的數據, 咱們會在不須要界面的時候及時的釋放和關閉某些進程等,以保證內存的充裕... 那麼咱們就來看看一個vc的生命週期是如何的 同時看看多個vc之間的交互中,是如何變化的...github
這裏我建立了3個視圖,第一個視圖中有兩個按鈕,第一個按鈕是push ,第二個按鈕是present, 分別對應的跳轉是push的操做和present的操做, 而後咱們在每個界面都進行這樣的編輯 網絡
相似這樣... 而後咱們運行整個項目看看 咱們看到的順序依次是這樣的. vc首先loadview初始化view,初始化完成以後會觸發viewdidload,表示view已經初始化,此時咱們能夠在其中建立更多的子控件,好比列表,好比按鈕,再以後view會分別觸發將要顯示和已經顯示的方法,有了這兩個方法,咱們就能夠在須要的地方對某些特殊的需求作出處理 那麼咱們點擊第一個push 咱們會看到這樣的過程 第一個視圖首先會觸發即將不顯示的方法,以後初始化第二個視圖,一樣的,其會加載視圖和將要顯示,可是不是一直到已經顯示,其會在已經顯示以前,肯定隱藏掉第一個視圖 咱們在點擊back看一看是不是隱藏第二個視圖,而後從新建立第一個視圖呢? 很顯然結果並非從新建立第一個視圖, 第一個視圖以前只是不作顯示了而已,其只會觸發第二個視圖和第一個視圖的將要隱藏/顯示以及完成隱藏/顯示的方法而已. 這樣的話第一個視圖無需從新加載,咱們就能直接返回,可是咱們也看到了第二個視圖會在完成隱藏以後觸發dealloc事件,此時表示的是第二個視圖已經被釋放,系統已經沒有了這個對象了,這樣作的理由1,系統已經肯定第二個視圖沒有做用了,覺得其工做已經完成,頗有可能用戶永遠也不會再進入這個界面了,那麼其就能夠直接釋放,同時也爲系統創造了更多的控件,若是咱們推出一個界面就永遠保存,那麼一個應用少則幾十個多則幾百個頁面,系統的控制確定壓力很大... 大體就是說, 若是咱們有navigationController導航欄的視圖,那麼系統就會爲咱們保存其從根視圖到當前最後一層顯示的vc,在這以後的vc以前都會被釋放,這樣纔是合理的, 因此說有的時候咱們在開發的時候若是遇到pop回來了,可是該釋放的vc沒有被釋放,那麼就是該vc由於什麼緣由而致使強引用沒法釋放,一般咱們遇到的狀況有block的循環引用致使,NSTimer對象的強引用致使等....ok關於push和pop的已經看完, 接下來咱們再看看present和dismiss的 .net
咱們看到會稍稍有所不一樣,其先觸發的是加載第三個視圖,而不是觸發第一個即將隱藏的方法,直到第三個視圖加載完畢纔會觸發..另外在顯示的順序也不同,其順序方式是先顯示第三個界面在隱藏第一個界面....這一點咱們都須要作到關注... 至於dismiss 咱們看到起和pop是同樣的順序.,且也會在隱藏後釋放以及時擴充系統資源...理由跟pop是同樣的.....Demo地址:github.com/spicyShrimp…cdn
系列:iOS開發-前言+大綱 blog.csdn.net/spicyShrimp…對象