self
和 super
的区别:
self
是类的一个隐藏参数,每个方法的实现的第一个参数即为 self
。
super
并不是隐藏参数,它实际上只是一个”编译器标示符”,它负责告诉编译器,当调用方法时,去调用父类的方法,而不是本类中的方法。
在调用 [super class]
的时候,runtime
会去调用 objc_msgSendSuper
方法,而不是 objc_msgSend
。
在 objc_msgSendSuper
方法中,第一个参数是一个 objc_super
的结构体,这个结构体里面有两个变量,一个是接收消息的 receiver
,一个是 当前类的父类 super_class
。
[super class]
不是调用 [super_class class]
。
objc_msgSendSuper
的工作原理应该是这样的:
从 objc_super
结构体指向的 superClass
父类的方法列表开始查找 selector
,找到后以 objc->receiver
去调用父类的这个 selector
。注意,最后的调用者是 objc->receiver
,而不是 super_class
!
找到了父类 NSObject
里面的 class
方法的 IMP
,传入的入参 objc_super->receiver = self
。