关于 Swift 里 Selector 的一个问题

2019-05-27 19:55:24 +08:00
 zhaidoudou123

Swift 初学者,以前一直只是用,今天突然想到一个问题怎么也理解不了。

比如我在设置一个按钮的响应时,常常需要用类似 action: #selector(function) 这样的代码,然后在写 function 具体内容的时候必须要加 @objc。

经过查阅,我发现加 @objc 的原因是因为使用了 Objective-C Runtime 的消息机制,虽然不太懂,我就当 selector 一定要这么用吧。

那么问题来了,为什么苹果不为 Swift 增加一个不需要依靠 Objective-C 的响应机制呢? 想知道大家的看法。

7677 次点击
所在节点    iDev
20 条回复
maxmak
2019-05-27 21:13:09 +08:00
selector 其实是 Objective-C runtime 的概念, swift5 以后开始会有 自己 runtime
Elethom
2019-05-27 21:28:42 +08:00
面包会有的,用 closure 的 API 也会有的。
luopengfei14
2019-05-27 21:58:03 +08:00
前期的 swift 相当于没有指针的 oc,依赖于 oc 吧……
zhaidoudou123
2019-05-27 22:07:19 +08:00
@maxmak @luopengfei14 谢谢,明白为什么一定要加 @objc

@Elethom 谢谢 那就只好等了😂
fvckDaybyte2
2019-05-28 10:46:42 +08:00
一般直接从 storyboard 拖出来吧,这么常用的东西到现在还是 oc 那一套的话,可能就是鼓励你从 storyboard 拖线?
lizhuoli
2019-05-28 12:54:25 +08:00
@Elethom 问题是,Closure 能解决纯代码上的用法,解决不了 Storyboard 这种非代码的运行时绑定问题,还是得用一个类似 Selector 的概念(具体名称是什么不重要不然)
不然也可以抄 Qt,造一个 Signal-Slot,然后 Storyboard 选择
Elethom
2019-05-28 13:30:21 +08:00
@lizhuoli
对 functions 做另一种形式的索引吗……你不说我都忘了还有 IB 这个东西了,太难维护,尤其是多人协作时,好多年没用了。
zhaidoudou123
2019-05-28 13:44:32 +08:00
@fvckDaybyte2 可能我是新手吧,我觉得直接写代码比在 sb 里拖按钮加约束方便点🤣🤣
fvckDaybyte2
2019-05-28 13:56:39 +08:00
@zhaidoudou123 线拖出来是弱引用,你看属性都是 weak,自己写容易把 target 写成强引用,可能造成循环引用吧,如果界面对象还不是重复使用而是频繁新建销毁的,就有可能内存泄漏,一般用代码写界面的我都觉得是大神,谦虚了
zhaidoudou123
2019-05-28 14:26:46 +08:00
@fvckDaybyte2
我只是单纯觉得方便,没考虑过内存泄露的问题🤣
你这么一说我确实觉得用 sb 拖好一点了,以后有机会再写的时候仔细学一学约束(先把毕设混过去…
seabirds
2019-05-31 01:57:59 +08:00
@fvckDaybyte2 target 不用考虑强引用的问题,xib 弱引用是因为控件 nib 文件创建的
fvckDaybyte2
2019-05-31 08:11:03 +08:00
@seabirds 然后呢?
seabirds
2019-06-05 17:29:31 +08:00
@fvckDaybyte2 只是发送消息的对象而已
fvckDaybyte2
2019-06-05 18:05:04 +08:00
@seabirds target 对象是不是被 selector 强引用了?如果 target 是 UIViewController 本身,VC 引用 selector, selector 引用 VC,不就是循环引用么?
fvckDaybyte2
2019-06-05 18:08:02 +08:00
@fvckDaybyte2 当然 selector 不一定是强引用 target,具体看实现的代码,我没看过。
seabirds
2019-06-05 18:33:54 +08:00
@fvckDaybyte2 不是强引用,只是将响应绑定到目标的方法上
fvckDaybyte2
2019-06-05 18:38:52 +08:00
@seabirds 绑定和引用的区别是啥😂,不知道你有没有学过 c 的指针,不懂完全可以理解,但是请不要误导他人……
xi_lin
2019-06-10 13:33:50 +08:00
@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.
fvckDaybyte2
2019-06-10 13:40:12 +08:00
@xi_lin 弱引用咯
wezzard
2019-07-18 00:33:17 +08:00
@lizhuoli 我覺得學 ECS 架構的事件響應機制也行,就是整體 GUI 的架構要遷移到 ECS 🌚

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/568138

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX