self、 superclass 、 super的区别

self、 superclass 、 super

self : 当前方法的调用者
class:获取方法调用者的类对象
superclass:获取方法调用者的父类对象
super:不是一个指针,编译指示器(标识符),在程序编译时内部会做一些特殊处理
 super的本质:其实还是当前对象去调用,只不过让当前对象去调用父类方法, super不是父类对象,指的是父类方法。
验证:

在一个main.m文件中定义一个Person类,重写description方法。

#import <objc/message.h>

@interface Person : NSObject

@end

@implementation Person

- (NSString *)description
{
    // super:当前对象调用
    // 调用NSObject方法
   return [super description];
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {

    }
    return 0;
}

在终端使用cd命令跳转的main.m所在的目录下,然后输入:clang -rewrite-objc main.m 命令,便可以将main.m文件转换为mian.cpp文件,打开文件在文件的末尾出可以看到[super description]这句代码的底层实现如下:

((NSString *(*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("Person"))}, sel_registerName("description"));

将上面代码简化掉强制类型转换后代码如下:

objc_msgSendSuper({self, class_getSuperclass(objc_getClass("Person"))}, sel_registerName("description"))

其中{self,class_getSuperclass(objc_getClass("Person"))}j即为super的底层实现,所以使用super调用父类的方法,其本质仍是当前对象调用父类的方法。

 // ViewController.m文件
- (void)viewDidLoad {
    // 创建SubPerson
    SubPerson *subP = [[SubPerson alloc] init];

    [subP test];
}

//Person.m 文件
- (void)test
{
    NSLog(@"%@ %@ %@ %@",[self class], [self superclass], [super class], [super superclass]);
}

//SubPerson.m 文件
- (void)test
{
    // 测试1
    NSLog(@"%@ %@ %@ %@",[self class], [self superclass], [super class], [super superclass]);

    // 测试2
    [super test];
}

测试1打印结果为:SubPerson Person SubPerson Person

测试2打印结果为:SubPerson Person SubPerson Person

时间: 2024-08-03 22:38:14

self、 superclass 、 super的区别的相关文章

object-c里self与super的区别 (转)

self与super的区别(转) 在objc中的类实现中经常看到这两个关键字”self”和”super”,以以前oop语言的经验,拿c++为例,self相当于this,super相当于调用父类的方法,这么看起来是很容易理解的.但是它们真正是如何调用的呢? 你知道吗? 以下面的代码为例: @interface Person:NSObject {NSString*  name;}- (void) setName:(NSString*) yourName;@end@interface PersonMe

Java中this与super的区别【6】

本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pipi-changing/ 本文版权归作者和博客园共有,未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文连接 ,否则保留追究法律责任的权利. Java中this与super的区别  this&super 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. Java关键字this只能用于方法的方法体内.当一个对象创建后, Java虚拟机(JV

4.30 this和super的区别和应用

/* 问题是: 不仅仅要输出局部范围的num,还要输出本类成员范围的num.怎么办呢? 还想要输出父类成员范围的num.怎么办呢? 如果有一个东西和this相似,但是可以直接访问父类的数据就好了. 这个关键字是存在的:super. this和super的区别? 分别是什么呢? this代表本类对应的引用. super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员) 怎么用呢? A:调用成员变量 this.成员变量 调用本类的成员变量 super.成员变量 调用父类的成员变量 B:

java对于this和super的区别

这篇文章详细解释了关于java中,this和super的区别的使用用法.http://www.cnblogs.com/hasse/p/5023392.html 以下是个人总结,主要针对面试的 this和super不能在同一个构造函数中使用,因为如果放在一起,有可能this会调用其他构造函数,而其他构造函数可能会调用super,这样就会导致同时出现同一个super.编译器不会通过 并且,this和super都必须写在构造函数的第一行

self与super的区别

要点: self调用自己方法,super调用父类方法 self是类,super是预编译指令 [self class]和[super class]输出是一样的 self和super底层实现原理: 当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找:而当使用 super 时,则从父类的方法列表中开始找,然后调用父类的这个方法. 当使用 self 调用时,会使用 objc_msgSend 函数: id objc_msgSend(id theReceiver, SEL

this和super的区别

1.this和super都代表什么 * this:代表当前对象的引用,谁来调用我,我就代表谁 * super:代表当前对象父类的引用 2.this和super的使用区别 a:调用成员变量 this.成员变量 调用本类的成员变量,也可以调用父类(本类中没有该变量,继承来的)的成员变量(this.num1) super.成员变量 调用父类的成员变量(super.num2)     b:调用构造方法 this(...)    调用本类的构造方法 super(...)    调用父类的构造方法 * su

5关键字this与super的区别

邴越 Java 关键字super和this的使用及区别 1年前 419 "this",作为一个特殊的关键字,它的规则如下: 1.可以表示构造函数传递.this(a,b)表示调用另外一个构造函数.这里面的this就是一个特殊语法,不是变量,没有什么类型. 2.可以在一个类的非static成员内部使用,表示当前这个对象.此时,this就是一个final的普通变量,它有静态类型,就是这个类本身:它有动态类型,就是当前这个对象的类型.你可以对它调用成员函数,把它传递给别的函数等. "

self和super的区别

(1)self调用自己方法,super调用父类方法 (2)self是类,super是预编译指令 (3)[self class]和[super class]输出是一样的 ①当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找:而当使用 super 时,则从父类的方法列表中开始找,然后调用父类的这个方法. ②当使用 self 调用时,会使用 objc_msgSend 函数: id objc_msgSend(id theReceiver, SEL theSelector

Android开发之深入理解泛型extends和super的区别

摘要: 什么是泛型?什么是擦除边界?什么是上界限定或下界限定(子类型限定或超类型限定)?什么是类型安全?泛型extends关和super关键字结合通配符?使用的区别,两种泛型在实际Android开发中有什么用处? 一.什么是泛型? 泛型,大概的意思是指没有指定具体的类型的类或方法,以泛型的形式传入一个类中或方法中,在Java编程(Android编程)里面使用一对尖括号和一个大写字母表示,例如: //泛型类 public interface List<E>{} //泛型方法,类型参数位于返回类型