您是否可以使用Xcode 9.x简要解释Swift 4中@objc
和dynamic
的含义?
使用stackoverflow中的尝试和错误以及以下文章,我最终实现了此代码段。但我想了解一下这些神奇的关键词。
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)
}
}
}
答案 0 :(得分:3)
玩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编程语言,我们有机会根据情况选择静态或动态调度,分别省略或添加这些神奇的关键字。
谢谢!
进一步阅读:
答案 1 :(得分:2)