提出問題:代碼創(chuàng)建一個uiview控件的時候,聲明weak還是strong?
UI 控件用默認(rèn)用 weak,根源還是蘋果希望只有這些 UI 控件的父 View 來強(qiáng)引用它們,而 ViewController 只需要強(qiáng)引用 ViewController.view 成員,則可以間接持有所有的 UI 控件。這樣有一個好處是:在以前,當(dāng)系統(tǒng)收到 Memory Warning 時,會觸發(fā) ViewController 的 viewDidUnload 方法,這樣的弱引用方式,可以讓整個 view 整體都得到釋放,也更方便重建時整體重新構(gòu)造。
但是首先 viewDidUnload 方法在 iOS 6 開始就被廢棄掉了,蘋果用了更簡單有效地方式來解決內(nèi)存警告時的視圖資源釋放,具體如何做的呢?嗯,這個可以當(dāng)作某一期的面試題展開介紹??傊褪牵悄闾厥獾夭僮?view 成員,ViewController.view 的生命期和 ViewController 是一樣的了。
所以在這種情況下,其實 UI 控件是不是 weak 其實關(guān)系并不大。當(dāng) UI 控件是 weak 時,它的引用計數(shù)是 1,持有它的是它的 superview,當(dāng) UI 控件是 strong 時,它的引用計數(shù)是 2,持有它的有兩個地方,一個是它的 superview,另一個是這個 strong 的指針。UI 控件并不會持有別的對象,所以,不管是手寫代碼還是 Storyboard,UI 控件是 strong 都不會有循環(huán)引用的。
那么回到我們的最初的問題,自己寫的 view 成員,應(yīng)該用 weak 還是 strong?我個人覺得應(yīng)該用 strong,因為用 weak 并沒有什么特別的優(yōu)勢,加上上一篇面試題文章中,我們還看到,其實 weak 變量會有額外的系統(tǒng)維護(hù)開銷的,如果你沒有使用它的特別的理由,那么用 strong 的話應(yīng)該更好。
另外有讀者也提到,如果你要做 Lazy 加載,那么你也只能選擇用 strong。
注意,如果你非要用 weak,其實也沒什么問題,只需要注意在賦值前,先把這個對象用 addSubView 加到父 view 上,否則可能剛剛創(chuàng)建完,它就被釋放了。