self与super的区别

要点:

  1. self调用自己方法,super调用父类方法
  2. self是类,super是预编译指令
  3. 【self class】和【super class】输出是一样的

self和super底层实现原理:

  1. 当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用 super 时,则从父类的方法列表中开始找,然后调用父类的这个方法。
  2. 当使用 self 调用时,会使用 objc_msgSend 函数: id objc_msgSend(id theReceiver, SEL theSelector, ...)。第 一个参数是消息接收者,第二个参数是调用的具体类方法的 selector,后面是 selector 方法的可变参数。以 [self setName:] 为例,编译器会替换成调用 objc_msgSend 的函数调用,其中 theReceiver 是 self,theSelector 是 @selector(setName:),这个 selector 是从当前 self 的 class 的方法列表开始找的 setName,当找到后把对应的 selector 传递过去。
  3. 当使用 super 调用时,会使用 objc_msgSendSuper 函数:id objc_msgSendSuper(struct objc_super *super, SEL op, ...)第一个参数是个objc_super的结构体,第二个参数还是类似上面的类方法的selector,

struct objc_super {
      id receiver;
      Class superClass;
};

当编译器遇到  [super setName:] 时,开始做这几个事:

1)构 建 objc_super 的结构体,此时这个结构体的第一个成员变量 receiver 就是 子类,和 self 相同。而第二个成员变量 superClass 就是指父类
调用 objc_msgSendSuper 的方法,将这个结构体和 setName 的 sel 传递过去。

2)函数里面在做的事情类似这样:从 objc_super 结构体指向的 superClass 的方法列表开始找 setName 的 selector,找到后再以 objc_super->receiver 去调用这个 selector

《简单介绍一下几个关键词》

class:获取当前方法调用者的类

supperclass:获取当前方法调用者的父类

supper:只是一个编译指示器,就是给编译器看的,不是一个指针,(指针是可以直接打印的),本质:只要编译器看到supper这个标志,就让当前对象调用父类方法,本质还是当前对象在调用

[self class],[super class],[self superclass],[super superclass];

用代码分别介绍

首先创建工程

ViewController,

Techer,

Student:继承与Techer

上代码:

#import "ViewController.h"

#import "Student.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

Student*stu=[[Student alloc]init];

[stu texta];//在Techer类中定义的texta方法

}

在Techer类中

#import <Foundation/Foundation.h>

@interface Techer : NSObject

-(void)texta;

@end

#import "Student.h"

@implementation Student

-(void)texta

{

NSLog(@"%@" @"%@" @"%@" @"%@",[self class],[super class],[self superclass],[super superclass]);

}

@end

输出结果为:

Student  Student  Techer  Techer

时间: 2024-10-09 17:19:51

self与super的区别的相关文章

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都必须写在构造函数的第一行

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

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的普通变量,它有静态类型,就是这个类本身:它有动态类型,就是当前这个对象的类型.你可以对它调用成员函数,把它传递给别的函数等. "

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

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

java中的this与super的区别

1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 代码如下: class Base { Base() { System.out.println("Base"); } } public class Checket extends Base { Checket() { super();//调用父类的构造方法,一定要放在方法的首个语句 System.out.println("Checket"); } public static void mai

56 面向对象this和super的区别和应用

this.成员变量 可以调用本类和父类的成员变量,当本类没有情况下调用父类 super.成员变量  调用父类的成员变量 1 class Demo1_Extends{ 2 public static void main(String[] args) { 3 Dog d = new Dog(); 4 d.print(); 5 } 6 } 7 8 class Animals{ 9 int num1 = 10; 10 int num2 = 20; 11 } 12 13 class Dog extends

Android中this、super的区别

转载:http://blog.csdn.net/dyllove98/article/details/8826232 在Java中,this通常指当前对象,super则指父类的.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数,这些马上就要讨论.如果你想引用父类的某种东西,则非 super莫属.由于this与super有如此相似的一些特性和与生俱来的某种关系,所以我们在这一块儿