objc_msgSend 分析

Runtime的介绍:Legacy(传统版本) Objective 1.0 Modern(现行版本) Objective 2.0
传统版本⽤于Objective-C 1.0, 32位的Mac OS X的平台上。
现⾏版本:iPhone程序和Mac OS X v10.5 及以后的系统中的 64 位程序 。
Runtime:是由c c++ 以及汇编混合编写成的给OC提供运行时功能的一套API。

6347155-6c20cbcf0d1b826f.png

注意:如果要在工程当中直接使用 objc_msgSend API,我们需要导入头文件 和 将 Enbale Strict Checking of objc_msgSend Calls 设置为 NO,这样才不会报错。

调用runtime的三种方式,如下图:


image.png

三种方法:
1.通过OC的代码调用runtime;如自定义的sayNB方法的调用;
2.OC底层Api的方法,比如isKindOfClass和isMemberOfClass;
3.runtime Api,如class_getInstanceSize.

objc_msgSend使用汇编写的。
为什么用汇编去写:
1、因为在C语言中不可能通过写一个函数来保留未知的参数并且跳转到一个任意的函数指针。C语言没有满足做这件事情的必要特性。
2、使用汇编实现,执行效率够快。

你可能感兴趣的:(objc_msgSend 分析)