美文网首页
系统底层源码分析(15)——对象的本质

系统底层源码分析(15)——对象的本质

作者: 无悔zero | 来源:发表于2021-06-18 11:29 被阅读0次

    我们写一段代码,然后编译成cpp文件:

    @interface Person : NSObject 
    {
        NSString *nikename; 
    }
    @property (nonatomic, copy) NSString *name; 
    @end
    
    @implementation Person
    @end
    

    .m文件由 OC 转 C++ 源码方法如下:
    打开终端,执行 cd 文件所在目录 命令,
    然后执行 clang -rewrite-objc xxx.m
    之后xxx.m 所在目录下就会生成一个 xxx.cpp 文件,这就是相关的 C++ 源码。

    //编译后
    extern "C" unsigned long OBJC_IVAR_$_Person$_name;
    struct Person_IMPL {
        struct NSObject_IMPL NSObject_IVARS;
        NSString *nikename;
        NSString *_name;//生成下划线
    };
    
    //getter
    static NSString * _I_Person_name(Person * self, SEL _cmd) { return (*(NSString **)((char *)self + OBJC_IVAR_$_Person$_name)); }
    extern "C" __declspec(dllimport) void objc_setProperty (id, SEL, long, id, bool, bool);
    //setter
    static void _I_Person_setName_(Person * self, SEL _cmd, NSString *name) { objc_setProperty (self, _cmd, __OFFSETOFIVAR__(struct Person, _name), (id)name, 0, 1); }
    

    对象的本质就是结构体。
    @@property写的属性和大括号里写的成员变量区别就是,属性名生成下划线,生成gettersetter方法。

    实际上我们编写的 OC 代码,最终都是转成了runtime库的东西。比如:

    1. 类转成了Runtime库里面的结构体等数据类型;
    2. 方法转成了Runtime库里面的 C 语言函数;
    3. 调用方法转成了 objc_msgSend 函数(所以说 OC 有个消息发送机制)

    相关文章

      网友评论

          本文标题:系统底层源码分析(15)——对象的本质

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