美文网首页
self和super

self和super

作者: 雷霸龙 | 来源:发表于2021-04-02 17:40 被阅读0次

1、self和super区别

self
  • 是关键字
  • 代表当前方法的调用者
  • 如果是类方法:代表当前类
  • 如果是对象方法:代表当前类的对象
super
  • 编译器指令

2、[self message]和[super message]的实现

其实不管是self还是super真正调用的对象都是一样的,只是查找方法的位置不一样,self是从当前类结构中开始查找,super是从父类中查找,但方法真正的接受者都是当前类或者当前类的对象

  • [self message]
    会转化为objc_msgSend(id self,SEL _cmd)这个函数,在当前类结构中找到方法并且调用

  • [super message]
    会转化为id objc_msgSendSuper(struct __rw_objc_super *super, SEL op, …)
    ,对比[self message]这里除了函数名加了super以外,第一个参数由self变成了一个结构体,下面让我们来解开这个结构体的真面目

struct __rw_objc_super { 
    struct objc_object *object; //代表当前类的对象
    struct objc_object *superClass; 
    __rw_objc_super(struct objc_object *o, struct objc_object *s) : object(o), superClass(s) {} 
};

这个结构体中有两个参数:object的对象和一个superClass的结构体指针,这里的object相当于上面的self

3、在执行[super message]时,会做下面的事

  • 编译器会先构造一个__rw_objc_super的结构体
  • 然后去superClass的方法列表中找方法
  • 找到之后由object调用。

所以当你用[self Class]和[super Class]打印类的时候,打印的都是同一个类,因为他们只是查找方法的位置不同,但是调用方法的类/对象是一样的.

4、为什么要写self = [super init]?

因为在Xcode中,你输入init然后tab就会帮你补全这个方法,以至于我们一直都忽略了为什么在[super init]之后还要赋值给self,然后进行判断,其实这和类簇有关系,我们不能保证init的内存和alloc出来的内存是同一块内存,像NSString在alloc和init之后的对象分别是NSPlaceholderString和__NSCFConstantString*造成[super init]之后的内存被改变,所以在[super init]之后是nil,因此我们不能保证alloc和init的是同一块内存,加上这样的判断是为了提高容错性,如果init成功就返回对象,否则返回nil。

相关文章

  • Lesson 0-2 Objective-C basic

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

  • self和super的区别

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

  • class

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

  • Objective-C self与super的区别

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

  • 单继承

    父类.方法(self,*args)和super(父类名,self).方法 当super(父类名,self).方法 ...

  • self、 superclass 、 super的区别

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

  • super

    示例 self [self class]、[self superclass]调用流程 super [super c...

  • self 和 Super

    刨根问底Objective-C Runtime(1)- Self & Super 下面的代码输出什么? @impl...

  • self和super

    本人主要介绍一下在OC中最常用的两个关键字self和super,它们常用在对象初始化方法里。不知道大家有没有想过研...

  • Super 和 Self

    我们都知道:self是类的隐藏参数,指向当前调用方法的这个类的实例。那 super 呢?很多人会想当然的认为“su...

网友评论

      本文标题:self和super

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