Objective-C super指针 superclass class 方法

super

- (void)run
{
    [super run];    
}
// 对应的C++代码
objc_msgSendSuper(self,(id)class_getSuperclass(objc_getClass("MJStudent"))}, sel_registerName("run"));
  • 从objc源码中,可以看到对 objc_msgSendSuper的定义, 传入的super参数结构是 objc_super
void objc_msgSendSuper(void /* struct objc_super *super, SEL op, ... */ )
  • objc_super的结构, 是由消息接收者receiver和父类super_clas组成
struct objc_super {
    __unsafe_unretained _Nonnull id receiver;
    unsafe_unretained _Nonnull Class super_clas
};
  • [super run]等价于
  struct objc_super arg = {self, [MJPerson class]};
  objc_msgSendSuper(arg, @selector(run));
  • objc_super可以看到消息的接收者仍然是self,传入父类的目的是直接父类开始查找方法的实现
NSLog(@"[self class] = %@", [self class]); // MJStudent
NSLog(@"[self superclass] = %@", [self superclass]); // MJPerson
//  [super class]C++层相当于 objc_msgSendSuper({self, [MJPerson class]}, @selector(class));,消息接受者仍然是self
// 只不过是父类的类对象开始搜索方法
// class是属于NSObject,class的值取决于消息的接受者是哪个
NSLog(@"[super class] = %@", [super class]); // MJStudent
 //objc_msgSendSuper({self, [MJPerson class], @selector(superclass)})
NSLog(@"[super superclass] = %@", [super superclass]); // MJPerson

从中间码可以看出

  • super调用,底层会转换为objc_msgSendSuper2函数的调用,接收2个参数
  • struct objc_super2
  • SEL
struct objc_super2 {
  id reciever
  Class current_class
}
  • reciever是消息的接收者
  • current_class是reciever的Class对象
  • 但是编译出的C++代码是objc_msgSendSuper,C++代码并不是完全可靠,最真实还应该看运行时干了什么
  • _objc_msgSendSuper2在objc中的源码
ENTRY _objc_msgSendSuper2
UNWIND _objc_msgSendSuper2, NoFrame
MESSENGER_START

ldp x0, x16, [x0]       // x0 = real receiver, x16 = class
ldr x16, [x16, #SUPERCLASS] // x16 = class->superclass
CacheLookup NORMAL

END_ENTRY _objc_msgSendSuper2
  • 通过上面汇编代码可以发现,其实底层是在函数内部调用的class->superclass获取父类,并不是上面分析的直接传入的就是父类对象。
  • 可以发现objc_super2中除了消息接受者receiver,另一个成员变量current_class也就是当前类对象。

class, superclass方法

  • class superclass是属于NSObject类
  • 在objc源码中,NSObject.mm中有它们的具体实现
+ (Class)class {
    return self;
}

- (Class)class {
  // self消息的接收者
    return object_getClass(self);
}

+ (Class)superclass {
    return self->superclass;
}

- (Class)superclass {
  // class_getSuperclass(object_getClass(self));
    return [self class]->superclass;
}

你可能感兴趣的:(Objective-C super指针 superclass class 方法)