runtime

作者: QYCD | 来源:发表于2021-10-27 16:42 被阅读0次

Objective-C扩展了C语言,并加入了面向对象特性和Smalltalk式的消息传递机制,这个扩展的核心是用C和汇编语言编写的runtime库,它是Objective-C面向对象和动态机制的基石。可以在这里下载苹果维护的开源代码。

  • runtime简称运行时,Objective-C就是运行时机制,即程序在运行时候的一些机制,其中最主要的是消息机制;
  • 对于C语言,函数的调用在编译阶段就会决定调用哪个函数;
  • 对于Objective-C,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数名称找到对应的函数来调用;
  • 在编译阶段,Objective-C可以调用任何函数,即使这个函数并未实现,只要声明过就不会报错;
  • 在编译阶段,C语言调用未实现的函数就会报错;

Objective-C将一些决定性的工作从编译期推迟到了运行时阶段,实现Objective-C语言运行时机制的一切基础就是runtime

Objective-C在三个不同的级别上与runtime系统进行交互:

  • 通过Objective-C源代码
  • 通过Foundation框架的NSObject类定义的方法
  • 通过直接调用runtime函数
Objective-C源代码

大多数情况我们只需要编写Objective-C代码即可,其他都交由runtime系统来后台执行具体的操作。
比如:

[receiver message];
//底层运行时会被编译器转化为
objc_msgSend(receiver, selector);
//若存在参数 则
objc_msgSend(receiver, selector, arg1, arg2, ... );
NSObject类

Cocoa程序中绝大部分类都继承自NSObject类,所以都继承了NSObject的行为。

  • -class方法返回对象的类;
  • -isKindOfClass: 和-isMemberOfClass: 方法检查对象是否存在于指定的类的继承体系中(是否是其子类或者父类或者当前类的成员变量);
  • -respondsToSelector: 检查对象能否响应指定的消息(方法);
  • -conformsToProtocol: 检查对象是否实现了指定协议类的方法;
  • -methodForSelector: 返回指定方法实现的地址;
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;

- (BOOL)respondsToSelector:(SEL)aSelector;

- (IMP)methodForSelector:(SEL)aSelector;
直接调用runtime函数

runtime系统是一个由一系列数据结构和函数组成,具有公共接口的动态共享库,其构成了NSObject类的基础,大部分还是使用更上层的接口编程,一般会用在hook接口或者与其他语言桥接等场景。


https://www.jianshu.com/p/633e5d8386a8

https://www.cnblogs.com/ioshe/p/5489086.html

相关文章

网友评论

      本文标题:runtime

      本文链接:https://www.haomeiwen.com/subject/bqdahltx.html