美文网首页selector
iOS 对self和super的理解

iOS 对self和super的理解

作者: 码农二哥 | 来源:发表于2021-04-03 18:08 被阅读0次
@implementation Son : Father
- (id)init
{
self = [superinit];
    if(self) {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
}
returnself;
}

答案:都输出 Son

self 是类的隐藏参数,指向当前调用方法的这个类的实例。而 super 是一个 Magic Keyword, 它本质是一个编译器标示符,和 self 是指向的同一个消息接受者。
上面的例子不管调用[self class]还是[super class],接受消息的对象都是当前 Son *xxx 这个对象。而不同的是,super是告诉编译器,调用 class 这个方法时,要去父类的方法,而不是本类里的。
当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用 super 时,则从父类的方法列表中开始找。然后调用父类的这个方法。

当调用 [self class] 时,实际先调用的是 objc_msgSend函数,第一个参数是 Son当前的这个实例,然后在 Son 这个类里面去找 - (Class)class这个方法,没有,去父类 Father里找,也没有,最后在 NSObject类中发现这个方法。而 - (Class)class的实现就是返回self的类别,故上述输出结果为 Son。

而当调用 [super class]时,会转换成objc_msgSendSuper函数。第一步先构造 objc_super 结构体,结构体第一个成员就是 self 。 第二个成员是 (id)class_getSuperclass(objc_getClass(“Son”)) , 实际该函数输出结果为 Father。 第二步是去 Father这个类里去找 - (Class)class,没有,然后去NSObject类去找,找到了。最后内部是使用 objc_msgSend(objc_super->receiver, @selector(class))去调用, 此时已经和[self class]调用相同了,故上述输出结果仍然返回 Son。

相关文章

  • iOS 对self和super的理解

    答案:都输出 Son self 是类的隐藏参数,指向当前调用方法的这个类的实例。而 super 是一个 Magic...

  • 0x001 理解iOS的[self class] 和 [supe

    0x001 理解iOS的[self class] 和 [super class] 1、定义LGPerson类 LG...

  • self和super的理解

    下面代码输出的是什么: 答案: 都是Son。 self 是类的隐藏参数,指向当前调用方法的这个类的实例。而 sup...

  • self和super的理解

    下面的代码输出什么?@implementation Son : Father - (id)init { self ...

  • self和super的理解

    下面的代码输出什么? @implementationSon:Father -(id)init { self=[su...

  • iOS Self和Super

    self调用自己方法,super调用父类方法self是类,super是预编译指令 super,class,supe...

  • 深入了解runtime

    iOS经典讲解之[self class]和[super class]的区别 iOS的消息机制和消息转发 Objec...

  • self和super的区别

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

  • Lesson 0-2 Objective-C basic

    11.self 和 super self代表一个指针,super是一个编译器指示符,self 和 super 都指...

  • class

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

网友评论

    本文标题:iOS 对self和super的理解

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