viewDidLoad被提前呼叫

2021-07-12 03:09:05 字數 1033 閱讀 6358

今天寫專案的時候發現了乙個非常奇怪的問題,我一度認為可能是我的 xcode 出了 bug。

先來猜猜下面**的執行順序?

這是一段非常常見的**,很多 controller 都是這麼寫的。

正常來說執行順序肯定是 1、2、3、4 無疑。然而事實上,執行順序卻是:1、3、4、2。

這就導致了乙個問題:viewmodel 請求不到資料,因為走到第 4 步的時候,viewmodel 還沒有被初始化,此時它是 nil。

如下圖所示:

從控制台中我們可以看到,最下面的 _viewmodel = nil。而且

當走完第 4 步後,程式竟然又回到了第 2 步。

起初我以為這是乙個 xcode 本身的 bug,因為它實在是太奇怪了。

後來我才知道,原來是因為 viewdidload 被提前呼叫了。

viewdidload 方法一般只會在 nib 檔案已載入記憶體,也就是檢視樹構建完成之後呼叫。

但是如果 controller 的 view 屬性被使用時為 nil,就會導致 nib 的載入,從而導致 viewdidload 的呼叫。

對於本文來說,我們在初始化方法中寫了 self.view.backgroundcolor = ***; 

這句話本身並沒有任何錯誤,但是它導致了 viewdidload 的提前呼叫,因此就出現了文章開頭提到的情況,執行順序變成了 1、3、4、2。

最後我的解決辦法是,把成員變數 _viewmodel 的初始化放到 viewdidload 裡。這又是為什麼呢?具體內容可以參考這篇文章:ios 開發中的爭議(一)類的成員變數應該如何定義?

大部分的類成員變數都需要在類初使化方法中賦值,大部分的 uiviewcontroller 的成員變數,都需要在viewdidload方法中賦值。

關於LayoutSubviews何時被呼叫

for this purpose,i will define a few view relationships i then ran the following tests.an x means the view was layed out from this i surmise the follo...

被百度K掉,應提前預防

聊天時經常有人說,建站很快,被k更快,突發性的被k或者被降權的事兒總會時有發生。相信大多數做seo的站長朋友對怎樣防止被k掉的理論都瞭若指掌,譬如 防掛馬 seo作弊 瘋狂採集 垃圾鏈結 人工降權等等,這些因素隨時都可能導致你的站點被k,直至收入癱瘓。一篇有軟文的可讀性,我認為最重要vizyl的就是...

Ubuntu 下mysql不能被遠端服務呼叫

一 ubuntu server 16.04 安裝mysql 1.使用root賬號 sudo apt get install mysql server sudo apt get install mysql client sudo apt get install libmysqlclient dev 如...