您能否简要解释一下使用Xcode 9.x的Swift 4中的@objcdynamic是什么意思?

通过尝试和错误以及stackoverflow中的后续文章,我终于实现了此代码片段的工作。但我想对这些神奇的关键字有所了解。

dynamic - @objc动态变量在Swift 4中是什么意思-LMLPHP

class SampleViewController: NSViewController {

  @objc class Parameters : NSObject {
    @objc dynamic var value1: Double = 0  // bound to Value of a NSTextfield with NumberFormatter
    @objc dynamic var value2: Double = 0  // as "parameters.value1" for the Model Key Path
  }

  @objc dynamic var parameters = Parameters()

  @objc dynamic var value3: Double {  // in the similar way as "value3" for the Model Key Path
    get {
      return parameters.value1 + parameters.value2
    }
  }

  override class func keyPathsForValuesAffectingValue(forKey key: String) -> Set<String> {
    switch key {
    case "value3" :
      return Set(["parameters.value1", "parameters.value2"])
    default:
      return super.keyPathsForValuesAffectingValue(forKey: key)
    }
  }

}

最佳答案

在玩Xcode及其反汇编程序时,我发现了一些。感谢Mike Henderson的评论。

首先,添加@objc修饰符似乎使编译器在可执行文件和/或库文件的__OBJC段中写入其对应的符号名,然后由Objective-C运行时系统使用。
otool -o filename命令向我们显示__OBJC段的内容。

其次,添加dynamic修饰符似乎使编译器插入其他汇编程序代码以与Objective-C运行时系统进行交互。附加代码实现了通过objc_msgSend()及其相关功能来访问动态属性。同样,调用dynamic方法也将通过objc_msgSend()完成。

现在,根据我的理解,术语dynamic dispatch表示使用objc_msgSend(),而static dispatch不使用它。在后一种情况下,访问变量和调用函数都将在没有Objective-C运行时系统干预的情况下完成,这与C ++ ABI的相似但不完全相同。

显然,静态一比动态一快。但是,静态的并不能实现Objective-C的神奇优势。使用Swift编程语言,我们有机会通过根据情况选择静态或动态调度,分别省略或添加那些神奇的关键字来利用这两个方面。

谢谢!

进一步阅读:


Objective-C Runtime
Using Swift with Cocoa and Objective-C (Swift 4.0.3)

关于dynamic - @objc动态变量在Swift 4中是什么意思,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48559768/

10-12 03:57
查看更多