objc_msgSendSuper 理解

刨根问底Objective-C Runtime

  super 调用 objc_msgSendSuper 告诉系统
去父类方法列表里面去找,但是调用者主体还是 self
和 self 的区别只是不在本类 的方法列表中查找

经常写的代码 如下

- (instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        count = 0;
        NSLog(@"%@",NSStringFromClass([self class]));
        NSLog(@"%@",NSStringFromClass([super class]));

    }
    return self;
}

super 的含义,消息转发会调用 objc_msgSendSuper, 就是 去父类的方法列表中找到 initWithFrame:这个方法,然后调用,调用的主体是 self。super 只是一个编译器的特殊字符,并不代表父类的一个实例化对象。这也就能明白为什么 调用 [super initWithFrame:frame]能得到本类的 实例化对象了,而不是父类的对象了。
[self class] [super class]class 这个方法都是 在 NSObject 对象中找到的,所以 都相当于 调用 [self class], 输入都是 一样的 SubView

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,808评论 0 9
  • 很久没去省图书馆了,大约半年多,前几天想起来要借阅几本书,今天我就穿越大半个济南来到了图书馆。 进去才知道变化很大...
    苏步哲阅读 2,860评论 0 0
  • 这个时候,楚荣其实并不知道想要做什么,从主管的办公室出来后,坐在办公位子的电脑前,屏幕处于被锁定状态。 用眼角的余...
    USECASE阅读 838评论 0 0