天天看點

iOS之淺談視圖控制器的生命周期

這段時間研究了一下視圖控制器的生命周期,在網上找了很多的資料,順着大家的較長的描述和說明,我也做了相應的實驗去驗證,其中包括一些擴充的内容研究。是以想寫一篇文章來記錄下研究的心得,但是還是感覺沒有了解很透徹,是以這也是标題中使用“淺談”的目的,這篇文章會随着以後的不斷學習和了解進行更新。

下面就開始正題: 雖然我在學習的過程中做了很多實驗,不過我會以一種總結的格式來書寫本文的闆書,這也利于以後的修改和總結 我們平時建立項目的時候經常順着蘋果推薦使用storyboard的思路使用Single View Application模闆,是以大多時候我們并不關心在AppDelegate類和viewController類之間發生了什麼。隻需要明白對于viewController中的初始化資訊就放在viewDidLoad中來寫。其實一個類的加載過程中是有很多方法的,下面就按照加載的先後順序來依次說明: 1、初始化方法:視圖控制器的初始化方法有三種,init、initWithCoder、initWithNibName這三種,如果在AppDelegate的入口方法

(或者是其他會進行建立視圖控制器的地方)使用init或者是initWithNibName方法進行視圖控制器的對象建立,實際上本質上都是調用了initWithNibName方法,而initWithCoder方法我們一般是不會使用它來初始化對象的(對于這個方法的原理我目前也沒有研究地很清楚)。這裡需要說明的一點是,如果去重寫這幾個方法,然後在方法裡面列印self.view,是可以通路到這個值的,也就是說在調用這幾個初始化方法的時候view已經存在了(但是需要注意的是背景顔色是黑色的),這個原因也是下面一點中提到的,視圖的操作方法(包括加載方法都是在alloc操作的時候就進行了) 2、視圖的操作方法:loadView、viewDidLoad(以及一系列的視圖的加載,出現等)這些方法通過我的測試發現(建立視圖控制器對象的時候隻使用alloc方法,不适用init方法),是在使用alloc進行記憶體配置設定的時候就調用了。另外,一個特别要注意的地方是:視圖控制器建立視圖的地方就是在loadView方法中,如果不重寫,那麼系統會預設調用loadView方法去建立對象,這也是為什麼視圖控制器建立好了之後就存在一個view,如果我們重寫loadView方法,但是在裡面不調用super的loadView方法,也就是不去建立一個view的話,那麼就會發生一個特别奇怪的現象,就是不停地調用loadView方法和viewDidLoad方法。在loadView方法裡面沒有去建立view,是不會報錯的,但是程式進入到viewDidLoad方法中的時候,去找view,卻發現找不到,是以又傳回到loadView方法中去。通過這點我們也可以loadView就是view的加載方法,在很多的場景中,如果視圖為nil,需要加載view,就會調用loadView方法。