swift class的虚函数表
class NSObjectBase: NSObject {
func Msg_Normal(){ }
func Msg_Second(){}
func Msg_Third(){}
@objc func Msg_ObjcX(){}
@objc dynamic func Msg_Objc_DynamicX(){ }
func callTest(){self.Msg_Normal()}
func callAgain(){self.Msg_Third()}
}
extension NSObjectBase{
@objc func OcExtensionFunc(){}
}
class DerivedOcClass:NSObjectBase{
override func Msg_Normal() {}
override func OcExtensionFunc(){}
override func Msg_Objc_DynamicX() {}
}
swiftc -emit-sil BaseClass.swift | xcrun swift-demangle > ClassFunc.silgen
cat ClassFunc.silgen
class NSObjectBase : NSObject {
func Msg_Normal()
func Msg_Second()
func Msg_Third()
@objc func Msg_ObjcX()
@objc dynamic func Msg_Objc_DynamicX()
func callTest()
func callAgain()
}
extension NSObjectBase {
@objc dynamic func OcExtensionFunc()
}
class DerivedOcClass : NSObjectBase {
override func Msg_Normal()
override dynamic func OcExtensionFunc()
override dynamic func Msg_Objc_DynamicX()
}
sil_vtable NSObjectBase {
#NSObjectBase.Msg_Normal!1: (NSObjectBase) -> () -> () : @NSObjectBase.NSObjectBase.Msg_Normal() -> () // NSObjectBase.Msg_Normal()
#NSObjectBase.Msg_Second!1: (NSObjectBase) -> () -> () : @NSObjectBase.NSObjectBase.Msg_Second() -> () // NSObjectBase.Msg_Second()
#NSObjectBase.Msg_Third!1: (NSObjectBase) -> () -> () : @NSObjectBase.NSObjectBase.Msg_Third() -> () // NSObjectBase.Msg_Third()
#NSObjectBase.Msg_ObjcX!1: (NSObjectBase) -> () -> () : @NSObjectBase.NSObjectBase.Msg_ObjcX() -> () // NSObjectBase.Msg_ObjcX()
#NSObjectBase.callTest!1: (NSObjectBase) -> () -> () : @NSObjectBase.NSObjectBase.callTest() -> () // NSObjectBase.callTest()
#NSObjectBase.callAgain!1: (NSObjectBase) -> () -> () : @NSObjectBase.NSObjectBase.callAgain() -> () // NSObjectBase.callAgain()
}
sil_vtable DerivedOcClass {
#NSObjectBase.Msg_Normal!1: (NSObjectBase) -> () -> () : @NSObjectBase.DerivedOcClass.Msg_Normal() -> () [override] // DerivedOcClass.Msg_Normal()
#NSObjectBase.Msg_Second!1: (NSObjectBase) -> () -> () : @NSObjectBase.NSObjectBase.Msg_Second() -> () [inherited] // NSObjectBase.Msg_Second()
#NSObjectBase.Msg_Third!1: (NSObjectBase) -> () -> () : @NSObjectBase.NSObjectBase.Msg_Third() -> () [inherited] // NSObjectBase.Msg_Third()
#NSObjectBase.Msg_ObjcX!1: (NSObjectBase) -> () -> () : @NSObjectBase.NSObjectBase.Msg_ObjcX() -> () [inherited] // NSObjectBase.Msg_ObjcX()
#NSObjectBase.callTest!1: (NSObjectBase) -> () -> () : @NSObjectBase.NSObjectBase.callTest() -> () [inherited] // NSObjectBase.callTest()
#NSObjectBase.callAgain!1: (NSObjectBase) -> () -> () : @NSObjectBase.NSObjectBase.callAgain() -> () [inherited] // NSObjectBase.callAgain()
}
class BaseClass {
func NormalFunc(){}
@objc func ObjcFunc(){}
@objc dynamic func ObjcDynamicFunc(){}
}
extension BaseClass{
@objc func ExtensionNormal(){}
func ExtenNoneOcNormal(){}
}
class DerivedClass:BaseClass{
override func NormalFunc() {}
override func ObjcFunc(){}
override func ObjcDynamicFunc(){}
override func ExtensionNormal(){}
}
extension DerivedClass{}
class BaseClass {
func NormalFunc()
@objc func ObjcFunc()
@objc dynamic func ObjcDynamicFunc()
init()
deinit
}
extension BaseClass {
@objc dynamic func ExtensionNormal()
func ExtenNoneOcNormal()
}
class DerivedClass : BaseClass {
override func NormalFunc()
override func ObjcFunc()
override dynamic func ObjcDynamicFunc()
override dynamic func ExtensionNormal()
override init()
deinit
}
sil_vtable BaseClass {
#BaseClass.NormalFunc!1: (BaseClass) -> () -> () : @BaseClass.BaseClass.NormalFunc() -> () // BaseClass.NormalFunc()
#BaseClass.ObjcFunc!1: (BaseClass) -> () -> () : @BaseClass.BaseClass.ObjcFunc() -> () // BaseClass.ObjcFunc()
}
sil_vtable DerivedClass {
#BaseClass.NormalFunc!1: (BaseClass) -> () -> () : @BaseClass.DerivedClass.NormalFunc() -> () [override] // DerivedClass.NormalFunc()
#BaseClass.ObjcFunc!1: (BaseClass) -> () -> () : @BaseClass.DerivedClass.ObjcFunc() -> () [override] // DerivedClass.ObjcFunc()
}
swift class的虚函数表的更多相关文章
- swift class的虚函数表、扩展、@objc修饰、虚函数的派发方式研究
swift class的虚函数表.扩展.@objc修饰的研究 工具: swiftc -emit-sil BaseClass.swift | xcrun swift-demangle > Clas ...
- swift protocol 见证容器 虚函数表 与 动态派发
一.测试代码: //protocol DiceGameDelegate: AnyObject { //} // //@objc protocol OcProtocol{ // @objc fun ...
- C++ 虚函数表解析
转载:陈皓 http://blog.csdn.net/haoel 前言 C++中 的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实 ...
- C++ 多态、虚函数机制以及虚函数表
1.非virtual函数,调用规则取决于对象的显式类型.例如 A* a = new B(); a->display(); 调用的就是A类中定义的display().和对象本体是B无关系. 2. ...
- C++迟后联编和虚函数表
先看一个题目: class Base { public: virtual void Show(int x) { cout << "In Base class, int x = & ...
- C++ 知道虚函数表的存在
今天翻看陈皓大大的博客,直接找关于C++的东东,看到了虚函数表的内容,找一些能看得懂的地方记下笔记. 0 引子 类中存在虚函数,就会存在虚函数表,在vs2015的实现中,它存在于类的头部. 假设有如下 ...
- C++虚函数和虚函数表
前导 在上面的博文中描述了基类中存在虚函数时,基类和派生类中虚函数表的结构. 在派生类也定义了虚函数时,函数表又是怎样的结构呢? 先看下面的示例代码: #include <iostream> ...
- C++ Daily 《5》----虚函数表的共享问题
问题: 包含一个以上虚函数的 class B, 它所定义的 对象是否共用一个虚函数表? 分析: 由于含有虚函数,因此对象内存包含了一个指向虚函数表的指针,但是这个指针指向的是同一个虚函数表吗? 实验如 ...
- C++虚函数表
大家知道虚函数是通过一张虚函数表来实现的.在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承.覆盖的问题,其内容真是反应实际的函数.这样,在有虚函数的类的实例中,这个表分配在了这个实例的内存中 ...
随机推荐
- 3分钟看完Java 8——史上最强Java 8新特性总结之第三篇 函数式编程技巧
目录 · 改写设计模式 · 策略模式(Strategy Pattern) · 模板方法模式(Template Method Pattern) · 观察者模式(Observer Pattern) · 责 ...
- 【学习笔记】剖析MVVM框架,简单实现Vue数据双向绑定
前言: 学习前端也有半年多了,个人的学习欲望还比较强烈,很喜欢那种新知识在自己的演练下一点点实现的过程.最近一直在学vue框架,像网上大佬说的,入门容易深究难.不管是跟着开发文档学还是视频教程,按步骤 ...
- [Luogu 3613] 睡觉困难综合征
Description 给定一棵 \(n\) 个点的树,每个点上有位运算 \(opt\) 和一个权值 \(x\),位运算有 &,|,^ 三种. 要求支持: 修改点 \(v\) 的 \(opt\ ...
- Java 图形化界面设计(GUI)实战练习(代码)
关于Java图形化界面设计,基础知识网上可搜,下面简单介绍一下重点概念,然后就由浅入深代码实例. 程序是为了方便用户使用的,Java引入图形化界面编程. 1.JFrame 是容器类 2.AWT 是抽象 ...
- 【原】通过BeanNameAutoProxyCreator改变臃肿代码
前言: 最近接手了一个项目,大概过了下需求,然后打开项目准备开搞的时候发现一个问题,这个项目是提供rest服务的一个web项目,其中很多旧系统由于还没改成微服务,所以只能通过HttpClient发起调 ...
- 【RabbitMQ】6、rabbitmq生产者的消息确认
通过Publisher Confirms and Returns机制,生产者可以判断消息是否发送到了exchange及queue,而通过消费者确认机制,Rabbitmq可以决定是否重发消息给消费者,以 ...
- C Looooops(poj2115+扩展欧几里德)
C Looooops Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Pr ...
- "美女相册"的 js 实现代码
划重点拉! 先来解释一下子标题 这个所谓的美女相册呢 并不是和你们想的一样龌龊 当然了 好像看起来也很龌龊 但是很多的版面都能用到这个功能的 然后在此处 我要为我的my$函数来进行一个诠释 就是 ...
- 【读书笔记】iOS-设置应用的硬件需求
如果你的应用需要一些特定的硬件设备才能运行,你可以在应用的Info.plist文件中添加应用运行所需的硬件列表.如果设备上没有这些硬件的话,你的应用将不会启动. 如图,找到Info.Plist---& ...
- engineecms——工程师知识管理系统,带文档协作和状态和流程
工程师们工作的平台,需要对图纸资料按工程项目名称,按工程项目阶段,按参与设计的专业等来分放. 而设计成果需要进行校审,才能算最终成果,也就是要具备状态和流程功能,这个一般网盘资源存储是做不到的. 一些 ...