美文网首页
iOS super关键字

iOS super关键字

作者: Good_Citizen | 来源:发表于2019-11-26 14:59 被阅读0次

先看下我们经常写的init方法,都会先调用父类的init方法

OC代码

通过命令xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc xxx.m -o xxx.cpp转换为c++代码如下

c++代码

可以看出[super init]其实是调用了objc_msgSendSuper方法,并且传了两个参数,第一个参数是一个objc_super结构体对象,而且有两个成员变量

一个是receiver,一个是super_class,也就是上面的self是给了receiver,而class_getSuperclass(objc_getClass("WPPerson"))是给了super_class,也就是第一个成员是当前实例对象self,第二个成员是self的父类,由于WPPerson是直接继承的NSObject,所以第二个成员就是NSObject,这是第一个参数结构体中的内容,第二个参数就是init方法了

接着看下objc_msgSendSuper方法的申明

注释里面选中的那一段的意思是方法查找从objc_super结构体中的第二个成员开始查找,也就是跳过self的类对象,直接从父类的类对象中查找init方法,所以这里的super的作用就是为了告诉编译器查找init方法需要从父类类对象中开始查找

上面是通过转为为c++代码的形式来查看super关键字的底层原理,下面我们从汇编层面看下super关键字的原理

接下来我们在self = [super init]代码行打上断点,然后将汇编模式打开Debug-》Debug Workflow-》勾上Always show Disassembly,运行代码,这时会进入汇编界面

可以看出[super init]其实是调用了objc_msgSendSuper2的方法,而且objc_msgSendSuper2和objc_msgSendSuper的实现还有点差别,之前的objc_msgSendSuper中的第一个参数中的结构体的第二个成员是父类,但是objc_msgSendSuper2中是当前类,只是在objc_msgSendSuper2方法内部转换成了父类,其他的就都是一样了,所以将OC转换为c++代码是作为参考的,有些地方不够准确,但是大部分地方都是和实际的实现一样。

相关文章

  • iOS runtime(3)-super原理和面试题

    1. super super关键字iOS开发都应该熟悉,但是对于super的原理大家可能不是很了解,而且在面试的过...

  • iOS runtime(3)-super原理和面试题

    1. super super关键字iOS开发都应该熟悉,但是对于super的原理大家可能不是很了解,而且在面试的过...

  • 基础2-对象-关键字

    this和super注意 this关键字 super关键字 instanceof关键字 final关键字 stat...

  • Java核心技术-继承

    super关键字 这里的关键字super具有不同的含义。语句super(n, s, year, month, da...

  • super关键字

    Java中super关键字用来引用直接父类的对象。super关键字用于继承上下文。super关键字主要用于: 引用...

  • Java 基础 20 super关键字以及继承中的方法重写

    1.1 super 关键字的概述和使用 1.1.1super 关键字的概述 super的用法和this很像this...

  • java面向对象

    方法重载 方法重写 继承父类( 关键字: super、extends) super 关键字1.用super调用父类...

  • Day08 Java面向对象——多态

    关键字super 1)super,相较于关键字this,可以修饰属性、方法、构造器2)super修饰属性、方法:在...

  • iOS super关键字

    例如1、:创建一个类Person再创建一个字类SonPerson继承自Person 在SonPerson中输出: ...

  • iOS super关键字

    先看下我们经常写的init方法,都会先调用父类的init方法 通过命令xcrun -sdk iphoneos cl...

网友评论

      本文标题:iOS super关键字

      本文链接:https://www.haomeiwen.com/subject/qvbewctx.html