message.h
概述
objc_super
/// Specifies the superclass of an instance.
struct objc_super {
/// Specifies an instance of a class.
__unsafe_unretained _Nonnull id receiver;
/// Specifies the particular superclass of the instance to message.
#if !defined(__cplusplus) && !__OBJC2__
/* For compatibility with old objc-runtime.h header */
__unsafe_unretained _Nonnull Class class;
#else
__unsafe_unretained _Nonnull Class super_class;
#endif
/* super_class is the first class to search */
};
#endif
这里定义了一个结构体objc_super。
这个结构体里有两个实例对象,一个是id类型的receiver,一个是Class(Class的定义是在objc.h中,Class是objc_class类型的结构体,objc_class在runtime.h中)类型的super_class。
receiver其实就是self,根据注释是指定了类的实例,即自己。
super_class即父类,指定了类的父类。
这个结构体的作用是什么呢?大概猜测一下,既然放在message.h里面,应该和消息转发有关。消息转发的时候指定谁去转发消息,首先是receiver,也即时self,然后是super_class,消息也传递到了指定的父类那里。
objc_msgSend、objc_msgSendSuper
这个类里面定义了一些objc_msgSend()函数,还有objc_msgSendSuper()。
objc_msgSend这个比较常见
((void (*)(id, SEL))objc_msgSend)(p, @selector(run));
这以下的函数我们并不常见,暂时不清除他们的作用,但是查查资料可以学习学习,既然和objc_msgSend都定义在message.h中,那可能也是做消息转发用的,objc_msgSend可以发送消息,下面这些方法当然也是用来发送消息的,只是在特定的其情况下runtime使用下面一些函数进行消息转发。
正常情况下,runtime会使用函数objc_msgSend()去转发消息。当本实例没找到对应的方法时,会去父类找,如果找到了就使用objc_msgSendSuper()去转发消息,如果还是未找到方法,会使用下面的一下函数进行消息转发。
objc_msgSend_stret、objc_msgSendSuper_stret
看这个函数的文档注释,感觉不像是抛出异常才会被使用。
它应该和objc_msgSend这个是“同一级”的函数。
stret是个什么?
看了看网上有人说stret就是struct return的缩写,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)