【问题标题】:Are public swift functions on ObjC objects dynamically or statically dispatched?ObjC 对象上的公共 swift 函数是动态还是静态调度的?
【发布时间】:2015-06-21 14:16:16
【问题描述】:

这是我的示例,假设我有一个自定义 UIView,带有响应此功能的点击手势识别器:

func handleTap(tap: UITapGestureRecognizer) {
    println("Tap!")
}

我通常更喜欢这些是私有的,因此我将其标记为私有,但它不起作用。需要 @objcdynamic 说明符,如下所示:

dynamic private func handleTap(tap: UITapGestureRecognizer) {
    println("Tap!")
}

这让我相信公共函数在添加到objective-c 对象时默认是动态的。是这样吗?如果找到,请引用参考文献。

【问题讨论】:

    标签: ios objective-c swift dispatch


    【解决方案1】:

    Swift 编译器将尝试证明对方法的调用只能以单个实现结束。如果它可以证明这一点,那么它将使用静态而不是动态调度。使用“final”或“private”关键字,以及整个模块优化,将对此有所帮助。

    【讨论】:

      【解决方案2】:

      来自Using Swift with Cocoa and Objective-C

      需要动态调度

      虽然@objc 属性暴露了你的 Swift API 到 Objective-C 运行时,它不保证动态 属性、方法、下标或初始化程序的调度。雨燕 编译器仍然可以去虚拟化或内联成员访问以优化 代码的性能,绕过 Objective-C 运行时。什么时候 您使用动态修饰符标记成员声明,​​访问 该成员始终是动态分派的。因为声明 用动态修饰符标记是使用 Objective-C 调度的 运行时,它们被隐式标记为 @objc 属性。”

      【讨论】:

      • 我认为这更能说明向 Swift 原生 api 添加动态调度。我的问题与 Objective-C 超类的 Swift 子类更相关。如果是这样的话,那我可能是误会了。你能详细说明一下吗?
      • 我相信 Greg Parker 对stackoverflow.com/questions/24057525/… 的回复会有所帮助
      猜你喜欢
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 2022-09-30
      • 2016-08-31
      相关资源
      最近更新 更多