美文网首页
self与super

self与super

作者: 平凡码农 | 来源:发表于2019-03-12 19:42 被阅读0次
@interface MyObjectB : MyObjectA

@end

@implementation MyObjectB

- (instancetype)init {
    self = [super init];
    MyObjectA *objA = [[MyObjectA alloc] init];
    NSLog(NSStringFromClass([self class]));
    NSLog(NSStringFromClass([super class]));
    return self;
}

@end

输出是什么?

其实可以通过clang来将代码编译为c++后,可以看到

static instancetype _I_MyObjectB_init(MyObjectB * self, SEL _cmd) {
    self = ((MyObjectB *(*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("MyObjectB"))}, sel_registerName("init"));
    MyObjectA *objA = ((MyObjectA *(*)(id, SEL))(void *)objc_msgSend)((id)((MyObjectA *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("MyObjectA"), sel_registerName("alloc")), sel_registerName("init"));
    ((Class (*)(id, SEL))(void *)objc_msgSend)((id)self, sel_registerName("class"));
    ((Class (*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("MyObjectB"))}, sel_registerName("class"));
    return self;
}

[super class] 转化成

objc_msgSendSuper)((__rw_objc_super){(id)self, (id)class_getSuperclass(objc_getClass("MyObjectB"))}, sel_registerName("class"))

再参考id objc_msgSendSuper(struct objc_super *super, SEL op, ...);的说明

Parameters

super

A pointer to an objc_super data structure. Pass values identifying the context the message was sent to, including the instance of the class that is to receive the message and the superclass at which to start searching for the method implementation.

receiver任然是self,但从superclass的方法列表开始查找方法。所以输出都为MyObjectB.

相关文章

  • Objective-C self与super的区别

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

  • if(self=[super init]) 为什么加if

    if(self=[super init])为什么不用“==”而用“=”: 这里不是判断self与[super in...

  • Runtime源码

    1 self/super与NSObject对象 self, super不计算在object的size里面,用cla...

  • self、 superclass 、 super的区别

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

  • day23 self 与 super , 父类调用子类方法 -

    day23 1.self 与 super , 父类调用子类方法 1.1 self 与 super 前面也写到了se...

  • super

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

  • self与super

    self访问成员变量 成员变量是定义在类中的变量,它可以被所在类的方法所调用,而局部变量是定义在方法中的变量,当局...

  • self 与 super

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

  • self与super

    self为实例对象:[self class]\object_getClass(self), 返回都是本类的类对象;...

  • self与super

    输出是什么? 其实可以通过clang来将代码编译为c++后,可以看到 [super class] 转化成 再参考i...

网友评论

      本文标题:self与super

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