-
為什么IBOutlet屬性是weak的?
因?yàn)楫?dāng)我們將控件拖到Storyboard上,相當(dāng)于新創(chuàng)建了一個(gè)對(duì)象,而這個(gè)對(duì)象是加到視圖控制器的view上,view有一個(gè)subViews屬性,這個(gè)屬性是一個(gè)數(shù)組,里面是這個(gè)view的所有子view,而我們加的控件就位于這個(gè)數(shù)組中,那么說(shuō)明,實(shí)際上我們的控件對(duì)象是屬于view的,也就是說(shuō)view對(duì)加到它上面的控件是強(qiáng)引用。當(dāng)我們使用Outlet屬性的時(shí)候,我們是在viewController里面使用,而這個(gè)Outlet屬性是有view來(lái)進(jìn)行強(qiáng)引用的,我們?cè)趘iewController里面僅僅是對(duì)其使用,并沒(méi)有必要擁有它,所以是weak的。
如果將weak改為strong,也是沒(méi)有問(wèn)題的,并不會(huì)造成強(qiáng)引用循環(huán)。當(dāng)viewController的指針指向其他對(duì)象或者為nil,這個(gè)viewController銷毀,那么對(duì)控件就少了一個(gè)強(qiáng)引用指針。然后它的view也隨之銷毀,那么subViews也不存在了,那么控件就又少了一個(gè)強(qiáng)引用指針,如果沒(méi)有其他強(qiáng)引用,那么這個(gè)控件也會(huì)隨之銷毀。
不過(guò),既然沒(méi)有必將Outlet屬性設(shè)置為strong,那么用weak就好了: ]
-
一個(gè)控件可以在viewController里面有多個(gè)Outlet屬性,就相當(dāng)于一個(gè)對(duì)象,可以有多個(gè)指針指向它(多個(gè)引用)。
但是一個(gè)Outlet屬性只能對(duì)應(yīng)一個(gè)控件,也就是說(shuō),如果有button1和button2,button1在viewController里面有一個(gè)名為button的Outlet屬性,此時(shí)button指向button1,但是如果用button2給button重新賦值,那么此時(shí)button指向button2。也就是說(shuō),后來(lái)的覆蓋原來(lái)的。
-
一個(gè)控件可以在viewController里面觸發(fā)多個(gè)IBAction。比如有一個(gè)button控件,在viewController里面有幾個(gè)方法,那么點(diǎn)擊button,會(huì)觸發(fā)所有的這些方法。
如果我有多個(gè)控件,比如button1,button2,button3,它們也可以同時(shí)綁定一個(gè)buttonClick方法,無(wú)論點(diǎn)擊button1,button2還是button3,都會(huì)觸發(fā)這個(gè)buttonClick方法。
-
上面說(shuō)了,button1,button2,button3有可能都觸發(fā)buttonClick方法,如果想在buttonClick方法里面區(qū)分到底是哪個(gè)button觸發(fā)的可能有好幾種做法。
- 可以給這三個(gè)button各設(shè)置一個(gè)Outlet屬性,然后在buttonClick里面判斷sender和哪個(gè)Outlet屬性是同一對(duì)象,這樣就可以區(qū)分了。但是很明顯,這樣并不合理,因?yàn)閯?chuàng)建的三個(gè)屬性有些浪費(fèi)。
- 我們可以給三個(gè)button各加一個(gè)tag,在buttonClick里面通過(guò)switch(或者if...)判斷,sender的tag和給各個(gè)button加上的tag是否一致,如果一致則為同一對(duì)象。
要慎用tag。因?yàn)関iew有一個(gè)viewWithTag:方法,可以在view的子view里面找到和我們傳入的tag相同的view,這樣哪怕不給這個(gè)控件創(chuàng)建Outlet屬性,也可以通過(guò)tag找到這個(gè)對(duì)象。但是很明顯,這個(gè)方法要遍歷子view,比較每個(gè)子view的tag,這樣效率并不高,所以盡量要避免這種情況。