2018-04-03-Runtime消息发送

要想一探消息发送的究竟,就不得不使用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进行调用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容