首先创建一个C语言工程:
项目名随便写。
目录结构如下:
main文件里:
#import <Foundation/Foundation.h>
#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 <Foundation/Foundation.h>
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;
后续更新博客再看如何寻找的。