先从一段代码说起:


@interface Person : NSObject
@end
@implementation Person
@end
@interface Son : Person
@end
@implementati源码编辑器编程猫下载on Son
- (instancetype)init
{
self = [super init];
if (self) {源码网站
NSLog(@"%@", [self class]);
NSLog(@"%@", [super class]);
}
return self;
}
@end
/// 打印成果:
So源码编辑器编程猫下载n
Son
都是Son

运用 clang -rewrite源码交易网站源码-objc 这个指令后,得到的中间代码有如下关键部分:

(void *)objc_msgSend)((id)self, sel_registerNam源码编辑器编程猫下载e("class")
(void *)objc_msgS源码本钱endSuper)((__rw_objc_super){源码交易网站源码 (id)self, (id)class_getSuperclass(objc_getClass("Son")) }, sel_registerName("class")

从上述C++源码可以看源码怎样做成app软件出,[self class][super class]的差异仅仅:
objc_msgSend(id, SEL)objc_msgSendSuper(__rw_objc_super *superclass, SEL) 的差异, 仅仅查找办法的起点不一样,前者是当时类Son,后者是父类Person

objc_msgSendSuper终究也会转为objc_msgSend源码网站( (id)self, sel_registerName("class"源码本钱))

那不便是一般的音讯发送的流程么,前者从Son初步找class办法,后者从父类Person初步找,由于两者都源码本钱没有cl源码交易网站源码ass办法,两者都来到基类NSObject,都调用基类的class办法。

检查runtime源码:

// NSObject.mm
-(Class)cla源码超市ss {
return object_getClass(self);
}
// objc-class.mm
Clas源码超市s object_getClass(id obj)
{
if (obj) retu源码本钱rn obj->getIsa();
else return Nil;
}

所以,其实两者都是去找selfisa指针指向的类政策,也便是Son
super仅仅一个编译指令,其实音讯接收者仍是sel源码怎样做成app软件f, 也便是当时类的实例政策。

  • 补充,为什么政策在初始化的时分,需要self = [super init]?

其实也是等于调一下父类的init办法,把父类的初始化数据带过来,源码网站写入到当时类的内存空间里,再交给当时类的实例政策。