ViewController的生命週期

2021-06-21 11:11:06 字數 1446 閱讀 8255

這個宇宙中,我們認知當中所有事物都是有乙個起點然後到達乙個終點。在四維的世界裡面,衡量的介質就是時間。所以我們寫的程式也是一樣的,不管是c還是ios程式裡面,每乙個東西在時間流逝中它都有自己的乙個起點,終點。

了解程式裡面大部分東西的起點和終點的意義是,我們想在這個東西誕生時候和結束的時候做一些事情,一些是我們自願加入的(比如初始化乙個美女的),有些是不得不做的(比如指向這個已經銷毀,但是這個指標你沒有賦值nil,其他的地方還在呼叫它,就會出錯)。

在uiviewcontroller初始化完畢和outlets進行hooked完成之後,第乙個呼叫的是viewdidload方法。

1
- (void)viewdidload;

我們可以把大部分初始化需要做的事情通過過載viewdidload來完成。僅僅需要小心的事情只有乙個就是如果你要設定view的大小(比如:bounds)你應該使用下面這個方法。

1

老頭說在這個方法下他有兩種比較傾向的做法:

第乙個理由很簡單,為了更快更好的使用者體驗,第二個也是,可以儲存使用者的資料,防止意外發生。

這兩個方法對應上面的兩個方法。他們都在view顯示之後呼叫。老頭的舉例是說view出現以後你想有乙個動畫,這時候就可以在這兩個方法裡面呼叫。

不管是wills的方法還是dids的方法。想要呼叫時候都是用super,例如

1

frame改變之前會呼叫viewwilllayoutsubviews(例如,橫向iphone時候frame就改變了。)

同理可得viewdidlayoutsubviews是frame改變之後呼叫。

這樣我們就可以根據不同的螢幕狀態來調整顯示,以便獲得最佳效果。

如果ios中記憶體過低,這時候,系統會自動的解除安裝view。意味著系統把viewcontroller從記憶體裡面乾掉,也就是停止所有指向viewcontroller的strong型別的指標。做完這些以後,viewdidunload會被呼叫。也就是self.view設定為nil時候呼叫。

直覺上來說,這時候貌似不用做什麼事情。可是為了最佳實踐。雖然你的outlets都是weak型別的。但是你還是需要手動在viewdidunload把它們設定為nil。這起碼算是一種好的ios程式設計習慣,我們應該把所有的outlet都設定為nil。

1
- (void)viewdidunload

如果你還是想知其然:大概就是可能在其他地方,有個指向這裡某個outlet的strong型別的指標。根據arc,這時候你的outlet是已經釋放了。但是那個strong指標仍然指向了之前的那個記憶體位址,如果這時候使用,記憶體就會錯誤,而設定了為nil以後,向nil是可以傳送任何訊息,不會錯誤的。(我是這樣理解,可能跟現實有出入。歡迎指正。)

隨便說一聲,不管記憶體有多低,正在現實的view是不會被unload的。所以只是針對螢幕以外的viewcontroller進行unload。

iOS 載入Viewcontroller的幾種方法

一 根據storyboardid 需要在storyboard設定 通過viewcontroller所在的storyboard來載入 uistoryboard storyboard uistoryboard storyboardwithname main bundle nil uiviewcontro...

ViewController的生命週期

關於viewdidunload 在發生記憶體警告的時候如果本檢視不是當前螢幕上正在顯示的檢視的話,viewdidunload將會被執行,本檢視的所有子檢視將被銷毀,以釋放記憶體,此時開發者需要手動對viewload viewdidload中建立的物件釋放記憶體。因為當這個檢視再次顯示在螢幕上的時候,...

ViewController的生命週期

當乙個檢視控制器被建立,並在螢幕上顯示的時候。的執行順序 alloc 建立物件,分配空間 init initwithnibname 初始化物件,初始化資料 loadview 從nib載入檢視 通常這一步不需要去干涉。除非你沒有使用xib檔案建立檢視 viewdidload 載入完成,可以進行自定義資...