首先創(chuàng)建一個C語言工程:
選擇注意項
項目名隨便寫涝焙。
目錄結(jié)構(gòu)如下:
目錄結(jié)構(gòu)
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的目錄下,執(zhí)行以下命令:
$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里。任何一句方法調(diào)用擂红,都會編譯成:objc_msgSend
總結(jié)以下就是:方法調(diào)用的本質(zhì)就是發(fā)送消息瘪松。
#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其實就是結(jié)構(gòu)體,這句話整理以下就是:對象的本質(zhì)就是結(jié)構(gòu)體S扑病0挤洹!
SEL 是方法編號阁危;
imp是一個函數(shù)的實現(xiàn)指針玛痊;
可以通過SEL找到對應(yīng)的imp;
后續(xù)更新博客再看如何尋找的。