美文网首页
iOS查看Runtime运行过程--Clang--轻量级编译器随

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

作者: OXHO | 来源:发表于2019-08-15 22:31 被阅读0次

    首先创建一个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;

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

    相关文章

      网友评论

          本文标题:iOS查看Runtime运行过程--Clang--轻量级编译器随

          本文链接:https://www.haomeiwen.com/subject/iowtsctx.html