oc 的 runtime机制(一)

  • Post author:
  • Post category:其他



最近 研究oc中的runtime机制。先把一些研究体会记录下来。




首先:runtime 是什么?




runtime是一套比较底层的纯C语言和混编语言的静态库,对外提供了一些API, 属于1个C语言库, 包含了很多底层的C语言API,使得面向过程的C语言有了面向对象的能力。



在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者 。


为了验证,我们可以这样创建一个oc工程,通过命令:clang -rewrite-objc XXX(文件名)查看 该文件的底层实现。



<span style="font-size:14px;">#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic,strong)NSString *name;
@property (nonatomic,assign)NSInteger age;

@end</span>


main.h 中:(包含头文件:#include<objc/runtime.h> ,我们可以在这个文件里,学到runtime的具体使用,不过文件较多,我们应该只看关键的一些地方)

<span style="font-size:14px;">#import <Foundation/Foundation.h>
#import "Person.h"
#include <objc/runtime.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        Person *person=[[Person alloc] init];
        
        person.name=@"zhangsan";
        person.age=25;
        
    }
    return 0;
}</span>


然后到终端 进入mian.m 的目录下:输入命令  clang -rewrite-objc main.m ,则会将oc的main,变成底层的c++实现方式。


对比 oc 中 的main.h

<span style="font-size:14px;">int main(int argc, const char * argv[]) {
    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 

        Person *person=((Person *(*)(id, SEL))(void *)objc_msgSend)((id)((Person *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("Person"), sel_registerName("alloc")), sel_registerName("init"));

        ((void (*)(id, SEL, NSString *))(void *)objc_msgSend)((id)person, sel_registerName("setName:"), (NSString *)&__NSConstantStringImpl__var_folders_p8_j5zl7s615xv5d0cpq31nsn680000gn_



版权声明:本文为u010165653原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。