iOS - 关于 IBOutlet 和 IBAction

在日常布局设计中,在storyboard/nil与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 outles are reestablished every time the containing object is unarchieved from its nib file

 IBOutlet的引用是通过Interface Builder来记录的。记录在nib被加载时会重新建立,在包含IBoutlet声明的对象和引用对象之间建立连接。

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

 

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 index position in matrix, or through its inclusion as s function parameter, or through use of a tag, you should do that instead.

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

IBAction

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

Target-action is a design pattern in which an object hold information necessary to send a message to another object when an even 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 typicallly a custom controller that handles the action message in an application-specific way.

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

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

Swift:

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

OC:

- (IBAction)doSomething:(id)sender;

方法传进来的sender是被触发事件的UIControl对象,因此开发者可以通过此对象获得事件触发时更详细的上下文信息。

这里的IBAction的原理和上面的IBoutlet类似,在nil文件加载时把UIControl组件的target-actino与controller的方法匹配。通过Interface Builder添加一条target-action记录后,查看nib文件的源代码格式可以看到类似的记录:

 

selector 即方法名称,destination 是目标对象(不明白为什么是 -1),eventType 是 UIControlEvents 的值的组合。


转载自:https://www.jianshu.com/p/1b75c76da610

原编辑时间 2020-11-24

posted @ 2021-11-24 13:20  Rogn  阅读(315)  评论(0编辑  收藏  举报