為什么建議UI控件一般使用weak抄课?首先我們從controller來看,controller是被系統(tǒng)用強(qiáng)指針引用著峭沦,所以如果 controller 還存在蒸辆,里面的子控件也會(huì)存在征炼,那么controller 強(qiáng)引用著它的view(從 controller 中它的 view 的屬性是 retain 看出來的,retain 就是 MRC 年代的強(qiáng)引用)躬贡,那么 view 又強(qiáng)引用著它的數(shù)組對(duì)象subviews谆奥,數(shù)組對(duì)象又引用著它所包含的數(shù)組內(nèi)容,所以當(dāng)我們創(chuàng)建出來一個(gè)UI控件并將其加入到subviews的時(shí)候拂玻,它就會(huì)被一個(gè)強(qiáng)指針?biāo)弥嵝覀兛梢院喕幌逻@個(gè)過程:--> Controller --> View --> Subviews(數(shù)組) --> 數(shù)組內(nèi)容(添加到其中的UI控件)
清楚了過程之后,我們來看我們所創(chuàng)建的對(duì)象檐蚜,如果我們所創(chuàng)建的是一個(gè)臨時(shí)變量的話魄懂,那么當(dāng)出去作用域之后對(duì)象就被銷毀,但是這里請(qǐng)注意闯第,這里分為兩個(gè)內(nèi)存空間市栗,一個(gè)是對(duì)象的內(nèi)存空間,一個(gè)是指針的內(nèi)存空間乡括,如果創(chuàng)建的是臨時(shí)變量的話肃廓,一旦出了作用域那么我們的指針內(nèi)存是被清空了,但是我們的內(nèi)容如果加到了subviews中诲泌,就會(huì)被subviews強(qiáng)引用盲赊,那么我們的控件就還會(huì)存在,只不過是一個(gè)指向它的指針被清空了而已敷扫。
回過頭我們說說全局變量哀蘑,全局變量的話,指針會(huì)一直存在葵第,這里面談?wù)劄槭裁匆脀eak绘迁,其實(shí)只要我們創(chuàng)建的控件加入到subviews中去的話,那么這個(gè)控件就會(huì)一直存在卒密,所以在這里我們所創(chuàng)建的指針是weak或strong其實(shí)只不過是多一個(gè)實(shí)線虛線的問題缀台,也就是控件已經(jīng)被強(qiáng)引用了,你再給它添加一個(gè)強(qiáng)引用或者弱引用在使用上都不會(huì)有什么問題哮奇,但是問題來了膛腐,如果我們r(jià)emove了這個(gè)控件,我們subViews中的那根線被切斷鼎俘,也就是這個(gè)代表我不再需要這個(gè)控件了哲身,那么這個(gè)時(shí)候如果再用一個(gè)strong來連接它,那么對(duì)象就不會(huì)被清除贸伐,既然我們都不需要它了勘天,為什么我還強(qiáng)引用它?這也就是為什么我們?cè)龠@里用弱引用的原因。`簡言之脯丝,就是內(nèi)存使用上的合理性商膊,當(dāng)這個(gè)控件我們需要的時(shí)候其實(shí)已經(jīng)有一個(gè)強(qiáng)引用在引用著它,我們沒有必要再弄一根指針來強(qiáng)引用著它巾钉,當(dāng)我們不需要它的時(shí)候翘狱,如果是weak的話自然而然直接釋放掉了,如果strong的話還會(huì)保留它砰苍,既然我們沒用了我們?yōu)槭裁催€要留著它而占用我們寶貴的內(nèi)存呢潦匈?我們也可以看一下這張圖片用來理解:
這里特殊說一下IBOutlet中的拖線創(chuàng)建,我們可以發(fā)現(xiàn)赚导,如果用storyboard或者xib進(jìn)行的脫線創(chuàng)建茬缩,蘋果都會(huì)自動(dòng)降屬性置為weak,這種做法似乎也符合我們之前的說法吼旧,但是蘋果又會(huì)在之前加了一個(gè)IBOutlet這個(gè)關(guān)鍵詞凰锡,那么這個(gè)詞是什么意思呢?我們看一下蘋果的官網(wǎng)解釋: The symbol IBOutlet is used only by Xcode, to determine when a property is an outlet; it has no actual value.
意思很清楚了圈暗,它僅僅是指定了一個(gè)屬性是一個(gè) 外部設(shè)置的掂为,并沒有實(shí)質(zhì)的含義,通常與外界連接是通過當(dāng)前的 viewcontroller 员串。那么在引用上又有什么不同呢勇哗?在官方文檔中是這么說的,在我們創(chuàng)建了IBOutlet之后寸齐,我們系統(tǒng)會(huì)有一個(gè)自動(dòng)對(duì)它進(jìn)行一個(gè)強(qiáng)引用欲诺,也就是又多了一條實(shí)線連接著它,當(dāng)控件從我們的subviews中移除之后渺鹦,這條線會(huì)自動(dòng)判斷去留扰法,也就是不會(huì)對(duì)我們的內(nèi)存的性能造成影響,該在的時(shí)候我在毅厚,該消失的時(shí)候自己就會(huì)消失了塞颁。這里也用一張圖來說明:
總結(jié):
我們首先是從內(nèi)存的利用上,我們建議對(duì)UI控件采用weak吸耿,其次是觀察蘋果的聲明方式殴边,依然是建議使用weak,因?yàn)闃?biāo)準(zhǔn)都是參考于蘋果珍语,而且合理性也擺在那里,為什么不用呢竖幔?