iOS - 關(guān)于 IBOutlet 和 IBAction

在日常布局設(shè)計(jì)中,你肯定試過無(wú)數(shù)次在 storyboard 或者 nib 與 view controller 之間建立 view 的對(duì)象引用惶傻。創(chuàng)建引用時(shí)你一定會(huì)留意到,屬性前多了一個(gè) IBOutlet 的修飾符。它是什么囱桨?有什么用途?下面就介紹一下它的來(lái)歷秀撇。

IBOutlet

官方文檔 中對(duì)其定義是:

An outlet is a property of an object that references another object.

IBOutlet 是一個(gè)對(duì)象屬性超棺,用于引用另一個(gè)對(duì)象。但為什么要額外添加這個(gè)修飾符呢呵燕?@property 不就是聲明一個(gè)屬性了嗎棠绘?繼續(xù)往下看:

The reference is archived through Interface Builder. The connections between the containing object and its outlets are reestablished every time the containing object is unarchived from its nib file.

IBOutlet 的引用是通過 Interface Builder 來(lái)記錄的。記錄在 nib 被加載時(shí)會(huì)被重新建立再扭,在包含 IBOutlet 聲明的對(duì)象引用對(duì)象之間建立連接氧苍。

所以我們知道,IBOutlet 的記錄是記錄在 nib 文件中泛范。nib 文件其實(shí)是 XML 格式让虐,在添加了一個(gè)IBOutlet 之后,通過看 nib 文件的源代碼可以看到多了一行以下代碼:


IBOutlet 的源碼聲明

property 對(duì)應(yīng) controller 里的屬性名字罢荡,destination 我沒有考究赡突,我認(rèn)為應(yīng)該是指向?qū)?yīng)的 controller,id 應(yīng)該是對(duì)應(yīng)這個(gè) IBOutlet 記錄的 id区赵。

這下就明白了:在 nib 被加載時(shí)惭缰,runtime 通過這些 IBOutlet 記錄來(lái)尋找到 controller 里的 IBOutlet 屬性聲明并建立連接,所以后續(xù)你就可以通過這些屬性來(lái)使用對(duì)應(yīng)的 view 對(duì)象笼才。


注意:官方文檔中有這么一段話:

The more outlets an object has, the more memory it takes up. If there are other ways to obtain a reference to an object, such as finding it through its index position in a matrix, or through its inclusion as a function parameter, or through use of a tag (an assigned numeric identifier), you should do that instead.

IBOutlet 會(huì)占用內(nèi)存漱受!如果一個(gè) view 集合包含了很多 view,出于內(nèi)存考慮骡送,其中一種做法是可以通過 tag 來(lái)辨別不同的 view拜效,或者直接通過代碼實(shí)例化 view 并建立引用,這樣就能避免 IBOutlet 的過度使用各谚。

說(shuō)實(shí)話對(duì)于 IBOutlet 會(huì)占用內(nèi)存的現(xiàn)象我是挺驚訝的紧憾,畢竟這是官方推行的布局方式,按理說(shuō)會(huì)做足優(yōu)化昌渤。至于它的影響有多大赴穗,我沒有去深入探討,有興趣的小伙伴可以研究研究膀息,有什么發(fā)現(xiàn)懇請(qǐng)分享一下成果般眉,不勝感激!

IBAction

在 iOS 與 macOS 開發(fā)中潜支,IBAction 是 target-action 設(shè)計(jì)模式里的概念甸赃。先看 target-action 設(shè)計(jì)模式的官方解釋:

Target-action is a design pattern in which an object holds the information necessary to send a message to another object when an event occurs. The stored information consists of two items of data: an action selector, which identifies the method to be invoked, and a target, which is the object to receive the message. The message sent when the event occurs is called an action message. Although the target can be any object, even a framework object, it is typically a custom controller that handles the action message in an application-specific way.

意思就是,target-action 機(jī)制用于一個(gè)對(duì)象(iOS 中通常是 UIControl 對(duì)象)在觸發(fā)某種事件時(shí)冗酿,通過發(fā)送特定的動(dòng)作信息(action message)給目標(biāo)對(duì)象(target)埠对,來(lái)實(shí)現(xiàn)彼此聯(lián)系的目的络断。

在 iOS 開發(fā)中,這是相當(dāng)常見的 UIControl 組件與 controller 之間進(jìn)行聯(lián)系的機(jī)制项玛。在代碼中貌笨,可以通過 addTarget(_:action:for:) 方法給 UIControl 組件(如 UIButton)添加特定事件(如 touchUpInside)被觸發(fā)時(shí),需要調(diào)用 controller 的哪個(gè)方法襟沮。如果通過 Interface Builder 來(lái)建立 UIControl 組件與 controller 之間的 target-action 機(jī)制的話锥惋,方法一般需要遵循一定的格式,如:

Swift:

@IBAction func doSomething(_ sender: Any) {
}

ObjC:

- (IBAction)doSomething:(id)sender;

方法傳進(jìn)來(lái)的 sender 是被觸發(fā)事件的 UIControl 對(duì)象开伏,因此開發(fā)者可以通過此對(duì)象獲取到事件觸發(fā)時(shí)更詳細(xì)的上下文信息膀跌。這里的 IBAction 的作用與上文講的 IBOutlet 類似,用于 nib 文件在加載時(shí)把 UIControl 組件的 target-action 配置記錄與 controller 的方法匹配固灵。通過 Interface Builder 添加了一條 target-action 記錄后淹父,查看 nib 文件的源代碼格式可以看到一條類似下面的記錄:

IBAction 記錄

selector 即方法名稱,destination 是目標(biāo)對(duì)象(不明白為什么是 -1)怎虫,eventTypeUIControlEvents 的值的組合。通過這樣困介,視圖布局連同與 controller 之間的聯(lián)系就可以相對(duì)直觀地建立起來(lái)大审。

參考

IBOutlet 的官方文檔
IBAction 的官方文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市座哩,隨后出現(xiàn)的幾起案子徒扶,更是在濱河造成了極大的恐慌,老刑警劉巖根穷,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姜骡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屿良,警方通過查閱死者的電腦和手機(jī)圈澈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尘惧,“玉大人康栈,你說(shuō)我怎么就攤上這事∨绯龋” “怎么了啥么?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贰逾。 經(jīng)常有香客問我悬荣,道長(zhǎng),這世上最難降的妖魔是什么疙剑? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任氯迂,我火速辦了婚禮践叠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘囚戚。我一直安慰自己酵熙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布驰坊。 她就那樣靜靜地躺著匾二,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拳芙。 梳的紋絲不亂的頭發(fā)上察藐,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音舟扎,去河邊找鬼分飞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛睹限,可吹牛的內(nèi)容都是我干的譬猫。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼羡疗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼染服!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起叨恨,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柳刮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后痒钝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秉颗,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年送矩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚕甥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栋荸,死狀恐怖梢灭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒸其,我是刑警寧澤敏释,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站摸袁,受9級(jí)特大地震影響钥顽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜靠汁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一蜂大、第九天 我趴在偏房一處隱蔽的房頂上張望闽铐。 院中可真熱鬧,春花似錦奶浦、人聲如沸兄墅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)隙咸。三九已至,卻和暖如春成洗,著一層夾襖步出監(jiān)牢的瞬間五督,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工瓶殃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留充包,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓遥椿,卻偏偏與公主長(zhǎng)得像基矮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冠场,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 譯者注:本文是對(duì) Apple 官方文檔的翻譯家浇,原文地址為:https://developer.apple.com/...
    ampire_dan閱讀 7,448評(píng)論 0 13
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,166評(píng)論 30 470
  • 在經(jīng)歷了巨痛苦的睡前寫作業(yè)的過程后,居然找到點(diǎn)享受的感覺了慈鸠。 從下午就開始盤算,今天俺該寫點(diǎn)啥呢灌具?有點(diǎn)像以前上大學(xué)...
    海闊無(wú)波閱讀 206評(píng)論 0 0
  • 今天群聊一個(gè)敏感話題炸開了鍋咖楣,“真愛”督笆。分手后的蘿卜依然很愛他的前女友,沒有選擇開始新歡诱贿,而是在漫長(zhǎng)的歲月里保留著...
    羅周先生閱讀 654評(píng)論 0 2
  • 元認(rèn)知能力-metacognition 對(duì)自己的思考過程的認(rèn)知與理解娃肿。 在丹尼爾·卡尼曼在《思考,快與慢》中引用了...
    樂事浮生閱讀 892評(píng)論 0 1