為什么IBOutlet是weak的以及tag的使用注意。

  • 為什么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ā)的可能有好幾種做法。

    1. 可以給這三個(gè)button各設(shè)置一個(gè)Outlet屬性,然后在buttonClick里面判斷sender和哪個(gè)Outlet屬性是同一對(duì)象,這樣就可以區(qū)分了。但是很明顯,這樣并不合理,因?yàn)閯?chuàng)建的三個(gè)屬性有些浪費(fèi)。
    2. 我們可以給三個(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,這樣效率并不高,所以盡量要避免這種情況。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 技術(shù) 最近正在準(zhǔn)備換份工作, 看到網(wǎng)上有份題庫(kù), 覺(jué)得不錯(cuò), 準(zhǔn)備整理下, 復(fù)習(xí)下所學(xué)知識(shí), 為面試做足準(zhǔn)備, 下...
    火之玉閱讀 6,460評(píng)論 7 104
  • Objective-C是一門(mén)動(dòng)態(tài)的語(yǔ)言 ① 什么是動(dòng)態(tài)語(yǔ)言? 動(dòng)態(tài)語(yǔ)言,是指程序在運(yùn)行時(shí)可以改變其結(jié)構(gòu):新的函數(shù)可...
    小李龍彪閱讀 418評(píng)論 0 0
  • http://www.devstore.cn/essay/essayInfo/6525.html【原文地址】 序言...
    起名好難_fz閱讀 717評(píng)論 1 1
  • Core Animation其實(shí)是一個(gè)令人誤解的命名。你可能認(rèn)為它只是用來(lái)做動(dòng)畫(huà)的,但實(shí)際上它是從一個(gè)叫做Laye...
    小貓仔閱讀 3,957評(píng)論 1 4
  • 昨晚確實(shí)沒(méi)有睡好。躁得很。 昨晚一如既往跟家里的小狼狗在沙發(fā)上抱著看電影,他已經(jīng)自認(rèn)是狗了,不知道為什么就不太純潔...
    法棍紅辣椒閱讀 429評(píng)論 0 0

友情鏈接更多精彩內(nèi)容