首页 > 其他分享 >领略一下swift函数派发机制流程

领略一下swift函数派发机制流程

时间:2023-07-17 20:14:13浏览次数:30  
标签:Animal 函数 派发 Dog 领略 func print swift

函数派发

Swift中函数的派发机制有三种:静态派发,函数表派发,消息派发。

静态派发

静态派发是指在运行时不需要查表,直接跳转到方法进行执行。静态派发的性能也是最高的。c语言采用的是直接派发。

函数表派发

class类型采用函数表派发。当一个对象调用一个函数时,会从对象的头8字节找到该对象的元信息。从元信息的函数表中找到执行的函数地址,并执行函数。

对象的元信息会在编译时写入macho文件中。

class Animal {
    func speak() {
        print("Animal speak")
    }
    func eat() {
        print("Animal eat")
    }
    func sleep() {
        print("Animal sleep")
    }
}
class Dog: Animal {
    override func speak() {
        print("Dog speak")
    }
    override func eat() {
        print("Dog eat")
    }
    func run() {
        print("Dog run")
    }
}class Animal {
    func speak() {
        print("Animal speak")
    }
    func eat() {
        print("Animal eat")
    }
    func sleep() {
        print("Animal sleep")
    }
}
class Dog: Animal {
    override func speak() {
        print("Dog speak")
    }
    override func eat() {
        print("Dog eat")
    }
    func run() {
        print("Dog run")
    }
}

Dog继承于Animal。let dog: Dog = Dog()dog 变量指向Dog对象。Dog对象在堆内存中。Dog对象的前8字节存有Dog对象的元信息。Dog对象的元信息中有该类的函数指针表。Dog中override父类Animal的函数会替换掉父类的函数存于Dogd的函数指针中。

swift### 消息派发

继承于NSObject的采用的是消息派发。Swift可以通过dynamic修饰来支持消息派发机制。

函数派发场景分析

在选择派发方式时,在编译期间就能决定执行哪个函数就采用静态派发。需要在运行期间决定执行哪个函数的就需要用函数表派发或者消息派发。不具动态性的的场景默认采用静态派发,这样派发效率更高。

struct无法继承,也就不具有动态性,函数派发在编译期间就能确定。

class和协议的 extension无法被子类继承,函数派发在编译期间就能确定。

class和协议的初始化方法,因为绝大多数时候需要被override的,所以采用函数表派发。

class的其他方法,如果没有被override,一般是函数表派发,但编译器也可能优化成直接派发。

class的 @objcextension能够继承,函数派发在执行期决定,并且是采用的是消息派发。

不继承NSObject的纯Swift,@objc的extension,采用的消息派发有点迷。消息派发机制需要有Objective-C的运行时,不继承与NSObject能有运行时的信息吗。该类的对象,

class FunctionDispatchObject {
     func test1() {
        print("test1")
    }
}
extension FunctionDispatchObject {
    @objc public func test2() {
        print("test2")
    }
}
// test1采用函数表派发
// test2采用消息机制派发:test2虽然写在extension里,当家里@objc,具有了动态性,可以继承了。class FunctionDispatchObject {
     func test1() {
        print("test1")
    }
}
extension FunctionDispatchObject {
    @objc public func test2() {
        print("test2")
    }
}
// test1采用函数表派发
// test2采用消息机制派发:test2虽然写在extension里,当家里@objc,具有了动态性,可以继承了。

标签:Animal,函数,派发,Dog,领略,func,print,swift
From: https://www.cnblogs.com/mysweetAngleBaby/p/17561036.html

相关文章

  • swift kvo问题
    按照官方文档的写法,在iOS10上必现crash。在网上找到类似的问题,但是我遇到的博客中说的不会crash的方式swift还是不要用kvo了,用combine框架吧......
  • 如何实现swift代码查询的具体操作步骤
    如何实现Swift代码查询引言作为一名经验丰富的开发者,你可能经常需要查询和查找Swift代码片段,以便更好地理解某个特定功能或解决问题。本文将教会你如何使用各种工具和方法来实现Swift代码查询。流程概览下面是一个整个Swift代码查询流程的概览表格。我们将逐步解释每个步骤以及......
  • Objective C无法访问Swift结构体struct
    letParseApplicationId="xxx"letParseClientKey="xxx"letAppGreenColor=UIColor(red:0.2,green:0.7,blue:0.3alpha:1.0)@objcclassConstant:NSObject{privateinit(){}classfuncparseApplicationId()->String......
  • Swift将项目里色值和字号归纳整理方便使用
    对于项目中的色值和字号可以通过定义枚举统一管理1.色值先创建一个和我们平时放图片同类的资源文件,这样也方便我们适配暗黑模式,如下2.建好以后如下,添加我们想要的色值,可以同时设暗黑模式下的色值3.然后定义色值的枚举,如下publicenumAPPColor{staticlettheme=UI......
  • Swift 多Target预编译Preprocessor Macros中添加字段后不生效处理
    在其中一个Target的PreprocessorMacros中添加字段RVCTAG后,代码判断发现不生效代码逻辑如下#ifPROJECTIDreturntrue#elsereturnfalse#endif还需要在BuildSetting---> Swiftcompiler-CustomFlags--->OtherSwfitFlags中添加对应的宏设置,如下 ......
  • iOS开发笔记 - 语言篇之Swift
     2014年的苹果全球开发者大会(WWDC),当CraigFederighi向全世界宣布“Wehavenewprogramminglanguage”(我们有了新的编程语言)的时候,全场响起了最热烈和持久的掌声,伴随着掌声到来的语言叫Swift。接下来CraigFederighi更是毫不掩饰的告诉大家,Swift将成为主宰iOS和Mac开发的新语言,甚......
  • swift 简单总结
    http://kpbp.github.io/swiftcheatsheet/#constantsSwiftisanewprogramminglanguagefordevelopingiOSandOSXappsthatwasintroducedbyAppleinJune2014.VariablesvarmyInt=1varmyExplicitInt:Int=1//explicittypevarx=1,y=2,z=3/......
  • Swift开发图解入门
    《论语·卫灵公》有一段经典对白:『子贡问为仁。子曰:工欲善其事,必先利其器。……』。对于一个程序员来说,好的工具不意味着一定能产生优质的代码,但是好的工具对提升开发效率的作用还是不言而喻的。想要用Swift做iOS开发,唯一可选的利器就是Xcode6了,童鞋们可以从下面的网站获得Xcode6的......
  • SwiftUI 界面的自我关闭(dismiss)
    使用dismiss环境变量NavigationStackView、Sheet等产生的次级界面,可使用@Environment(\.dismiss)vardismiss自行控制消失。structDetailView:View{@Environment(\.dismiss)vardismissvarbody:someView{Button("关闭DetailView"){......
  • python网络爬虫课程设计--探索Taylor Swift歌词
    python网络爬虫课程设计--探索TaylorSwift歌词一、选题的背景泰勒·斯威夫特(TaylorSwift),1989年12月13日出生于美国宾夕法尼亚州,美国乡村音乐、流行音乐创作女歌手、演员、慈善家。 2006年,与独立唱片公司大机器唱片签约,推出首支单曲《TimMcGraw》与发行首张同名专辑《Taylor......