iOS開發(fā)中,控件的創(chuàng)建一般是兩種,一種是通過 Storyboard/xib 創(chuàng)建,一種是通過純代碼創(chuàng)建。通過IB創(chuàng)建的控件,其實(shí)試圖默認(rèn)對其有著強(qiáng)引用-->比如IB創(chuàng)建一個(gè)UIButton -->形成了以下引用:UIViewController -->UIView-->subView --> UIButton,而只要有subView,就會(huì)為其添加強(qiáng)引用,所以IB創(chuàng)建的控件,一般是使用weak。

而對于純代碼創(chuàng)建的控件,在我印象中看到的很多都是用strong,我查閱過不少資料,大致說的都是-strong 和 weak 沒啥大區(qū)別區(qū)別,對于純代碼創(chuàng)建的控件,而我在工作中正好有遇到這個(gè)問題,就進(jìn)行了一下探究--> 純代碼創(chuàng)建的控件,使用weak 還是strong 連接比較好。
當(dāng)然,創(chuàng)建控件的時(shí)候,還是有些許區(qū)別的:

當(dāng)使用weak的時(shí)候,發(fā)現(xiàn)不能用self.Btn直接創(chuàng)建控件,因?yàn)槭侨粢?,?chuàng)建完控件也就銷毀了,所有如果是weak,要多一步:

這樣就可以實(shí)現(xiàn),weak - property 創(chuàng)建的控件,不會(huì)因?yàn)闆]有強(qiáng)引用,而導(dǎo)致一創(chuàng)建直接被銷毀了;
以下圖為例:

我們創(chuàng)建一個(gè)如同所示的的按鈕,使用strong,然后對按鈕的屬性進(jìn)行設(shè)置:

運(yùn)行的結(jié)果如上,這里是沒有添加到contentView的,我們知道,當(dāng)一個(gè)控件 addSubView 的時(shí)候,會(huì)為其添加一個(gè)強(qiáng)引用,在這里,我們沒添加到 self.View中,發(fā)現(xiàn) faceBtn 還是有內(nèi)存地址的!但是!

當(dāng)我們使用weak的時(shí)候,發(fā)現(xiàn)該控件未添加強(qiáng)引用的情況下,地址也不為空:

但是,出了{(lán) xxx } 作用域之后,強(qiáng)弱引用的差別就出現(xiàn)了!

當(dāng)我們在 touchsBegan方法中再調(diào)用這個(gè)控件的地址時(shí):

發(fā)現(xiàn)strong-->該控件存在;

weak -->控件銷毀了!
此時(shí):如果添加到contenView,為其添加強(qiáng)引用,weak -->Btn 也不會(huì)銷毀

此時(shí),就算是弱引用的控件,出了作用域也還存在,未被銷毀!
--->華麗分割線:調(diào)用removeFromSuperView方法,可以查看weak 和 strong的區(qū)別:

這里發(fā)現(xiàn),removeFromSuperView之后,控件的地址還在,并未被消除!難道控件執(zhí)行了假的-removeFromSuperView方法?
-->注意:又是作用域的區(qū)別?。?!

當(dāng)如果是 strong 指向的控件時(shí),由于 當(dāng)前的控制器 -->(強(qiáng)引用)指向 該控件:faceBtn,所以removeFromSuperView 無效! 移除了contentView的強(qiáng)引用,但是當(dāng)前控制器的 強(qiáng)引用還存在,所以該控件不會(huì)被銷毀!

但是,當(dāng)我們使用weak的時(shí)候,----->華麗分割線!

這樣有個(gè)好處,就是removeFromSuperView能真正生效!雖然當(dāng)前{ xxx }中,我們會(huì)發(fā)現(xiàn) 控件還未被釋放,但是 如果再次使用的時(shí)候,我們對控件屬性 使用weak 或者 strong 的區(qū)別,就出現(xiàn)了?。?/p>
-->使用strong:只有當(dāng)前控制器被銷毀的時(shí)候,指向faceBtn的強(qiáng)引用才會(huì)取消,faceBtn才會(huì)被銷毀,所以這種情況下,即便是removeFromSuperView,還是無法釋放該控件!只能強(qiáng)行手動(dòng)設(shè)置:btn = nil;所以個(gè)人建議:還是使用weak連接控件,只要我們在創(chuàng)建控件的時(shí)候,在當(dāng)前的作用域 { xxx }中,添加到contentView上,就能為其添加強(qiáng)引用保證它不被銷毀。然后當(dāng)我們r(jià)emoveFromSuperView的時(shí)候,可以實(shí)現(xiàn)控件的銷毀!
總結(jié):控件建議使用weak(不管是IB創(chuàng)建還是純代碼創(chuàng)建)