@objc 之后调用的所有代码都需要符合 Objective-C 吗?

Posted

技术标签:

【中文标题】@objc 之后调用的所有代码都需要符合 Objective-C 吗?【英文标题】:does all the code called after @objc need to be Objective-C compliant? 【发布时间】:2018-11-28 12:14:04 【问题描述】:

当我使用#selector 将函数作为目标添加到UIButton 时,我应该将其标记为@objc,这没关系。但问题是@objc 函数调用的每个函数和方法都必须符合Objective-C,否则应用程序崩溃。 例如,当我使用 Swift 枚举(我也将该枚举声明为 @objc)时,它会因此错误而崩溃 unrecognized selector sent to instance

这是使用@Objc 的预期行为,还是我做错了什么?

如果是,是否有解决方法,或者我应该让 @objc 调用的所有内容都符合 Objective-C 标准(在某些情况下,我需要重新编写一大堆代码)?

【问题讨论】:

如何确定“发送到实例的无法识别的选择器”崩溃是因为“@objc”。如果“@objc”有任何问题,我相信编译器不会允许你运行你的代码,也不会有任何运行时错误。因此,您的现金可能在不同的地方,或者您的方法名称可能不匹配。如果可能,还请显示您的代码。 @IBAction@objcMembers. 这不是预期的。你在做不正确的事情。请创建一个 mcve 来展示您所描述的内容 (***.com/help/mcve) 代码很大,我正在尝试将其减少为仅导致崩溃的部分。 【参考方案1】:

@objc 属性使您的 Swift API 在 Objective-C 和 Objective-C 运行时中可用。

在 Swift 4 版本发布后,很少有 @objc 的推理案例被移除。这意味着在少数其他情况下,在 Swift 编译器推断出 @objc 标头之前,在 Swift 4 中不会推断出。

因此,通过这种情况,您现在可以了解导致问题的原因以及如何使用@objc。

确保您使用的是 swift 语言版本 4 或更新版本。从目标 -> 构建设置中找到 Swift 语言版本以查看您使用的版本。

希望对你有帮助。

【讨论】:

【参考方案2】:

在对代码进行了大量试验后,我注意到问题在于将自定义对象保存到 UserDefaults,而没有使用 NSKeyedArchiver 对其进行归档。

【讨论】:

以上是关于@objc 之后调用的所有代码都需要符合 Objective-C 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Groovy集合遍历 ( 调用集合的 every 方法判定集合中的所有元素是否符合闭包规则 | =~ 运算符等价于 contains 函数 | 代码示例 )

当其他东西需要返回值时,指示 ObjC 调用中的错误情况

Swift:具有符合协议的实例的完成闭包

从 Objc 超类继承的 Swift 子类中未调用 viewDidLoad

swift3.0解疑@objc

objc-runtime源码编译