1.Objective-C源代码
很多时候, 我们只要编写OC源代码就在不知不觉中使用了运行时. 如OC的消息机制, 就是在运行时转化为C函数并且动态地查找调用需要的方法实现.
2.NSObject 的方法
如以下方法NSObject自省方法,同样也需要在运行时通过isa指针获取对象的各种信息.
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
- (BOOL)respondsToSelector:(SEL)aSelector;
3.运行时函数
如以下函数(位于objc/runtime.h):
const char *object_getClassName(id obj)
void *object_getIndexedIvars(id obj)
其实和2中的方法并没有本质的区别, 只是可能因为那些方法更常用而将运行时函数封装为OC方法.(猜测)
注:在很多人眼中, 那些Runtime函数和我们平常使用的方法没有任何区别, 因为我们并不能看到OC的动态调用. OC是对C语言的扩充, 而从面向过程到面向对象的转变的关键就在Runtime,通过动态调用实现了类的继承. 所以只要我们使用OC的继承,就会间接使用Runtime. 在新手眼中, Runtime是类似CFNetwork/RN/各种SDK等 这种需要我们熟悉用法的暗物质. 而事实上Runtime是OC面向对象特性的基础.