Swift

Swift中的分发机制

2019-03-05  本文已影响0人  小宇pod

介绍

方法分发是指程序确定哪个操作应该被执行的机制。有时候,我们只希望在运行时才确定一个方法决定执行什么行为。这就产生了多种不同的分发方法的机制,而他们也各有各的有缺点。

目录

静态分发

动态分发

表分发
消息分发

Swift

区别分发机制的方法
sil_vtable Animal {
    #Animal.makeSound!1: (Animal) -> () -> () : main.Animal.makeSound() -> ()   // Animal.makeSound()
  ......
}

(2)如果一个函数通过消息分发,关键词volatile就会出现在调用中。而且,你将会发现两个标记foreignobjc_method,说明这个函数是在OC运行时调用的。

%14 = class_method [volatile] %13 : $Dog, #Dog.beWild!1.foreign : (Dog) -> () -> (), $@convention(objc_method) (Dog) -> () // user: %15

(3)如果没有以上两个关键词,那么就是静态调用。

一般情况
extension Animal {
    func eat() { }
    @objc dynamic func getWild() { }
}
class Dog: Animal {
    override func eat() { } // Compiled error!
    @objc dynamic override func getWild() { }   // Ok :)
}
其他情况
protocol Noisy {
    func makeNoise() -> Int // TABLE
}
extension Noisy {
    func makeNoise() -> Int { return 0 }    // TABLE
    func isAnnoying() -> Bool { return true }   // STATIC
}
class Animal: Noisy {
    func makeNoise() -> Int { return 1 }    // TABLE
    func isAnnoying() -> Bool { return false } // TABLE
    @objc func sleep() { }  // Still TABLE
}
extension Animal {
    func eat() { }  // STATIC
    @objc func getWild() { }    // MESSAGE
}
let animal1 = Animal()
print(animal1.isAnnoying()) // Value: false
let animal2: Noisy = Animal()
print(animal2.isAnnoying()) // Value: true
%9 = class_method %8 : $Animal, #Animal.sleep!1 : (Animal) -> () -> (), $@convention(method) (@guaranteed Animal) -> () // user: %10
相关规则

结论

现在,我们已经知道了方法分发是什么和在Swift中选择的分发方式是什么样的。这里提供了一些例子来更方便理解Swift如何解析特定功能。并且,通过阅读SIL,我们也能得到对于分发一个方法应该遵循的假设的证据。

上一篇 下一篇

猜你喜欢

热点阅读