iOS - 关于 IBOutlet 和 IBAction

在日常布局设计中,你肯定试过无数次在 storyboard 或者 nib 与 view controller 之间建立 view 的对象引用。创建引用时你一定会留意到,属性前多了一个 IBOutlet 的修饰符。它是什么?有什么用途?下面就介绍一下它的来历。

IBOutlet

官方文档 中对其定义是:

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

IBOutlet 是一个对象属性,用于引用另一个对象。但为什么要额外添加这个修饰符呢?@property 不就是声明一个属性了吗?继续往下看:

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 来记录的。记录在 nib 被加载时会被重新建立,在包含 IBOutlet 声明的对象引用对象之间建立连接。

所以我们知道,IBOutlet 的记录是记录在 nib 文件中。nib 文件其实是 XML 格式,在添加了一个IBOutlet 之后,通过看 nib 文件的源代码可以看到多了一行以下代码:


IBOutlet 的源码声明

property 对应 controller 里的属性名字,destination 我没有考究,我认为应该是指向对应的 controller,id 应该是对应这个 IBOutlet 记录的 id。

这下就明白了:在 nib 被加载时,runtime 通过这些 IBOutlet 记录来寻找到 controller 里的 IBOutlet 属性声明并建立连接,所以后续你就可以通过这些属性来使用对应的 view 对象。


注意:官方文档中有这么一段话:

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 会占用内存!如果一个 view 集合包含了很多 view,出于内存考虑,其中一种做法是可以通过 tag 来辨别不同的 view,或者直接通过代码实例化 view 并建立引用,这样就能避免 IBOutlet 的过度使用。

说实话对于 IBOutlet 会占用内存的现象我是挺惊讶的,毕竟这是官方推行的布局方式,按理说会做足优化。至于它的影响有多大,我没有去深入探讨,有兴趣的小伙伴可以研究研究,有什么发现恳请分享一下成果,不胜感激!

IBAction

在 iOS 与 macOS 开发中,IBAction 是 target-action 设计模式里的概念。先看 target-action 设计模式的官方解释:

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 机制用于一个对象(iOS 中通常是 UIControl 对象)在触发某种事件时,通过发送特定的动作信息(action message)给目标对象(target),来实现彼此联系的目的。

在 iOS 开发中,这是相当常见的 UIControl 组件与 controller 之间进行联系的机制。在代码中,可以通过 addTarget(_:action:for:) 方法给 UIControl 组件(如 UIButton)添加特定事件(如 touchUpInside)被触发时,需要调用 controller 的哪个方法。如果通过 Interface Builder 来建立 UIControl 组件与 controller 之间的 target-action 机制的话,方法一般需要遵循一定的格式,如:

Swift:

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

ObjC:

- (IBAction)doSomething:(id)sender;

方法传进来的 sender 是被触发事件的 UIControl 对象,因此开发者可以通过此对象获取到事件触发时更详细的上下文信息。这里的 IBAction 的作用与上文讲的 IBOutlet 类似,用于 nib 文件在加载时把 UIControl 组件的 target-action 配置记录与 controller 的方法匹配。通过 Interface Builder 添加了一条 target-action 记录后,查看 nib 文件的源代码格式可以看到一条类似下面的记录:

IBAction 记录

selector 即方法名称,destination 是目标对象(不明白为什么是 -1),eventTypeUIControlEvents 的值的组合。通过这样,视图布局连同与 controller 之间的联系就可以相对直观地建立起来。

参考

IBOutlet 的官方文档
IBAction 的官方文档

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容

  • 译者注:本文是对 Apple 官方文档的翻译,原文地址为:https://developer.apple.com/...
    ampire_dan阅读 7,416评论 0 13
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,139评论 30 470
  • 在经历了巨痛苦的睡前写作业的过程后,居然找到点享受的感觉了。 从下午就开始盘算,今天俺该写点啥呢?有点像以前上大学...
    海阔无波阅读 204评论 0 0
  • 今天群聊一个敏感话题炸开了锅,“真爱”。分手后的萝卜依然很爱他的前女友,没有选择开始新欢,而是在漫长的岁月里保留着...
    罗周先生阅读 653评论 0 2
  • 元认知能力-metacognition 对自己的思考过程的认知与理解。 在丹尼尔·卡尼曼在《思考,快与慢》中引用了...
    乐事浮生阅读 879评论 0 1