iOS查看Runtime运行过程--Clang--轻量级编译器随笔

首先创建一个C语言工程:

选择注意项

项目名随便写。

目录结构如下:


目录结构

main文件里:

#import 
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        
        
        Person *p = [[Person alloc]init];
        
        [p run];
    }
    return 0;
}

Person.h里

#import 

NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject


- (void) run;
@end

NS_ASSUME_NONNULL_END

Person.m里

#import "Person.h"

@implementation Person

- (void)run{
    NSLog(@"hellow  its me");
}
@end

打开终端,cd到main.m的目录下,执行以下命令:
$clang -rewrite-objc main.m -o main.cpp

输出如下(不用理会):


输出

我们看访达,里面多了一个文件,打开它


访达目录
我们想要的

Person *p = ((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))(void *)objc_msgSend)((id)p, sel_registerName("run"));

//可以知道我们在OC里。任何一句方法调用,都会编译成:objc_msgSend

总结以下就是:方法调用的本质就是发送消息。

#ifndef _REWRITER_typedef_Person
#define _REWRITER_typedef_Person
typedef struct objc_object Person;
typedef struct {} _objc_exc_Person;
#endif

struct Person_IMPL {
    struct NSObject_IMPL NSObject_IVARS;//
};

我们看到Person其实就是结构体,这句话整理以下就是:对象的本质就是结构体!!!

SEL 是方法编号;
imp是一个函数的实现指针;
可以通过SEL找到对应的imp;

后续更新博客再看如何寻找的。

你可能感兴趣的:(iOS查看Runtime运行过程--Clang--轻量级编译器随笔)