美文网首页
self和super的区别

self和super的区别

作者: SwiftUI | 来源:发表于2020-03-26 01:16 被阅读0次

由一个面试题引出的问题,为什么[self class][super class]打印的结果一样?

WX20200326-002624@2x.png

这里,我们使用汇编和objc源码结合的方式来研究一下。为了使汇编代码看起来简洁明了一点,去掉了打印,只保留了super调用,然后在此打上断点。

WX20200326-003048@2x.png

这里勾选上永远显示汇编代码

image.png

可以看到,这里rbp栈寄存器用来创建了2个临时变量,-0x8(%rbp)存储着rdi的值,-0x10(%rbp)存储着rsi的值,分别各占8个字节。

image.png

然后我们来读取一下两个寄存器中的值,发现寄存器rdi的值和左边self的值一样,在断点进入第13行汇编代码时,可以知道-0x20(%rbp)存储着self的地址,并且把这个值存入到了寄存器rdi-0x18(%rbp)存储着Student类对象的地址0x100003768,我们知道函数调用,寄存器rdirsi一般用来传递参数。

image.png

从上面得知,寄存器rdi(低8个字节存储着self的地址,高8个字节存储着Student类对象的地址)传递给了objc_msgSendSuper2中的struct objc_super * super,寄存器rsi(存储着函数run的地址)传递给了SEL op

#if __OBJC2__
// objc_msgSendSuper2() takes the current search class, not its superclass.
OBJC_EXPORT id _Nullable
objc_msgSendSuper2(struct objc_super * _Nonnull super, SEL _Nonnull op, ...)
    OBJC_AVAILABLE(10.6, 2.0, 9.0, 1.0, 2.0);

接下来,我们看struct objc_super的定义。

/// Specifies the superclass of an instance. 
struct objc_super {
    /// Specifies an instance of a class.
    __unsafe_unretained _Nonnull id receiver;

    /// Specifies the particular superclass of the instance to message. 
#if !defined(__cplusplus)  &&  !__OBJC2__
    /* For compatibility with old objc-runtime.h header */

//通过刚才汇编可以知道,这里存储着的是当前类,不是其父类。
    __unsafe_unretained _Nonnull Class class;
#else
    __unsafe_unretained _Nonnull Class super_class;
#endif

    /* super_class is the first class to search */
};

最终是在objc_msgSendSuper2中从当前类的父类开始搜索这个方法。

image.png

总结一下,super本质上是一个结构体,存储着对象self和当前类对象Class,然后会用这个结构体创建一个临时变量,最终会调用objc_msgSendSuper2,并传递这个结构体变量和SEL的地址。

所以[super class]就是找到父类的class方法,然后用self来调用,所以会打印Student。

相关文章

  • Objective-C self与super的区别

    Objective-C self与super的区别 [self class] 和 [super class] 在当...

  • self、 superclass 、 super的区别

    self、 superclass 、 super的区别 self、 superclass 、 super self...

  • self和super的区别

    self和super的区别 self调用自己方法,super调用父类方法 self是类,super是预编译指令 [...

  • class

    1.[self class]和 [super class] self和super的区别: self是类的一个隐藏参...

  • self和super区别

    在objc中的类实现中经常看到这两个关键字”self”和”super”,但他们的区别表现在各个方面。以下面的代码为...

  • self和super区别

    self:调用自己方法,它是类super:调用父类方法,它是预编译指令【self class】和【super cl...

  • iOS self 和 super区别以及为什么要self = [

    //联系人:石虎QQ: 1224614774昵称:嗡嘛呢叭咪哄 一、self和super区别 区别:- self调...

  • self和super的区别

    关于 self 和 super 在oc 中 的疑惑 与 分析 这个问题貌似很初级,但很容易让人忽略,me too ...

  • self和super的区别

    由一个面试题引出的问题,为什么[self class]和[super class]打印的结果一样? 这里,我们使用...

  • iOS - 关键字self和super

    一、self 和 super 区别 self 是类,super 是预编译指令(就是给编译器看的,不是一个指针; 只...

网友评论

      本文标题:self和super的区别

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