先从一段代码说起:
@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;
}
所以,其实两者都是去找self
的isa
指针指向的类政策,也便是Son
。
super
仅仅一个编译指令,其实音讯接收者仍是sel源码怎样做成app软件f
, 也便是当时类的实例政策。
- 补充,为什么政策在初始化的时分,需要
self = [super init]
?
其实也是等于调一下父类的init办法,把父类的初始化数据带过来,源码网站写入到当时类的内存空间里,再交给当时类的实例政策。