Swift 初学者,以前一直只是用,今天突然想到一个问题怎么也理解不了。
比如我在设置一个按钮的响应时,常常需要用类似
action: #selector(function)
这样的代码,然后在写 function 具体内容的时候必须要加 @objc。
经过查阅,我发现加 @objc 的原因是因为使用了 Objective-C Runtime 的消息机制,虽然不太懂,我就当 selector 一定要这么用吧。
那么问题来了,为什么苹果不为 Swift 增加一个不需要依靠 Objective-C 的响应机制呢? 想知道大家的看法。
1
maxmak 2019-05-27 21:13:09 +08:00
selector 其实是 Objective-C runtime 的概念, swift5 以后开始会有 自己 runtime
|
2
Elethom 2019-05-27 21:28:42 +08:00 via iPhone
面包会有的,用 closure 的 API 也会有的。
|
3
luopengfei14 2019-05-27 21:58:03 +08:00 via iPhone
前期的 swift 相当于没有指针的 oc,依赖于 oc 吧……
|
4
zhaidoudou123 OP |
5
fvckDaybyte2 2019-05-28 10:46:42 +08:00 via iPhone
一般直接从 storyboard 拖出来吧,这么常用的东西到现在还是 oc 那一套的话,可能就是鼓励你从 storyboard 拖线?
|
6
lizhuoli 2019-05-28 12:54:25 +08:00 via iPhone
@Elethom 问题是,Closure 能解决纯代码上的用法,解决不了 Storyboard 这种非代码的运行时绑定问题,还是得用一个类似 Selector 的概念(具体名称是什么不重要不然)
不然也可以抄 Qt,造一个 Signal-Slot,然后 Storyboard 选择 |
7
Elethom 2019-05-28 13:30:21 +08:00 via iPhone
@lizhuoli
对 functions 做另一种形式的索引吗……你不说我都忘了还有 IB 这个东西了,太难维护,尤其是多人协作时,好多年没用了。 |
8
zhaidoudou123 OP @fvckDaybyte2 可能我是新手吧,我觉得直接写代码比在 sb 里拖按钮加约束方便点🤣🤣
|
9
fvckDaybyte2 2019-05-28 13:56:39 +08:00 via iPhone
@zhaidoudou123 线拖出来是弱引用,你看属性都是 weak,自己写容易把 target 写成强引用,可能造成循环引用吧,如果界面对象还不是重复使用而是频繁新建销毁的,就有可能内存泄漏,一般用代码写界面的我都觉得是大神,谦虚了
|
10
zhaidoudou123 OP |
11
seabirds 2019-05-31 01:57:59 +08:00 via iPhone
@fvckDaybyte2 target 不用考虑强引用的问题,xib 弱引用是因为控件 nib 文件创建的
|
12
fvckDaybyte2 2019-05-31 08:11:03 +08:00 via iPhone
@seabirds 然后呢?
|
13
seabirds 2019-06-05 17:29:31 +08:00 via iPhone
@fvckDaybyte2 只是发送消息的对象而已
|
14
fvckDaybyte2 2019-06-05 18:05:04 +08:00
@seabirds target 对象是不是被 selector 强引用了?如果 target 是 UIViewController 本身,VC 引用 selector, selector 引用 VC,不就是循环引用么?
|
15
fvckDaybyte2 2019-06-05 18:08:02 +08:00
@fvckDaybyte2 当然 selector 不一定是强引用 target,具体看实现的代码,我没看过。
|
16
seabirds 2019-06-05 18:33:54 +08:00 via iPhone
@fvckDaybyte2 不是强引用,只是将响应绑定到目标的方法上
|
17
fvckDaybyte2 2019-06-05 18:38:52 +08:00
@seabirds 绑定和引用的区别是啥😂,不知道你有没有学过 c 的指针,不懂完全可以理解,但是请不要误导他人……
|
18
xi_lin 2019-06-10 13:33:50 +08:00 1
@fvckDaybyte2 先看文档再说
Summary Associates a target object and action method with the control. Declaration - (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; Discussion You may call this method multiple times to configure multiple targets and actions for the control. It is also safe to call this method multiple times with the same values for the target and action parameters. The control maintains a list of its attached targets and actions along with the events each supports. The control does not retain the object in the target parameter. It is your responsibility to maintain a strong reference to the target object while it is attached to a control. Specifying a value of 0 for the controlEvents parameter does not prevent events from being sent to a previously registered target and action method. To stop the delivery of events, always call the removeTarget:action:forControlEvents: method. |
19
fvckDaybyte2 2019-06-10 13:40:12 +08:00
@xi_lin 弱引用咯
|