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接口或者与其他语言桥接等场景。
网友评论