要想一探消息发送的究竟,就不得不使用Rumtime,OC的实质就是消息的发送,接下来我们将简单的OC代码以消息发送的形式进行调用
* Basic Messaging Primitives
//在某些处理器上返回某些结构体
* On some architectures, use objc_msgSend_stret for some struct return types.
//在某些处理器上返回float类型
* On some architectures, use objc_msgSend_fpret for some float return types.
//也会在某些处理器上适用如下函数返回float类型
* On some architectures, use objc_msgSend_fp2ret for some float return types.
//要调用objc_msgSend函数,必须要将函数强制转换成合适的函数指针类型才能调用。
* These functions must be cast to an appropriate function pointer type
* before being called.
*
- 先创建一个学生类Student

Student.h
-
在.m中实现具体方法
Student.m
在.m文件中有实现了一个eat方法,但并没有在.h中暴露出接口,目的是在控制器中利用perform调用
OC的调用方式

OC的调用方式
接下来,我们要利用msgSend()方法来调用方法了,根据头文件里的描述要调用objc_msgSend函数,必须要将函数强制转换成合适的函数指针类型才能调用:
- 先引入objc_message头文件:
#import <objc/message.h>
- 进行类型转换
Student *stu = ((Student *(*)(id, SEL, NSString *, NSInteger))objc_msgSend)((id)[Student class], @selector(studentWithName:age:), @"小明",12);
((Student *(*)(id, SEL, NSString *, NSInteger))objc_msgSend)这就是强制对obj_msgSend进行类型转换,这是带一个对象指针返回值和四个参数的函数指针
现在可以看出使用消息发送形式已经替换了原有OC的写法,可以正常调用

消息发送形式创建对象
接下来根据同样的方式,调用study()方法,同理,对study方法的调用如上述初始化对象一样
((void (*) (id, SEL))objc_msgSend)((id)stu, @selector(study));

study方法消息方式调用
同样,利用消息发送机制,可以对未声明的方法进行调用

对未在.h文件中声明的方法eat进行调用
