zoukankan      html  css  js  c++  java
  • ObjectiveC Runtime 初探(一)

    Objective-C 是一种通用、面向对象的编程语言。它以 C 语言为基础并添加了 Smaltalk 的消息特性。它是一种具有动态特性,强类型的编译型语言,其中动态特性是指可以在运行时创建类,为类添加成员变量,为类添加方法。我认为 Objective-C 语言设计的比较灵巧:只在 C 语言的基础上增加了比较薄的一层,就具有了面向对象特性和一定的动态特性,于是非常好奇它是如何实现这些特性的。

    源码版本:objc4-437.3,可以从苹果的网站上下载。

    Objective-C Runtime 2.0 与之前的相比进行了重新实现,这里不分析 2.0 的运行时。

    Class 的定义

    typedef struct objc_class *Class;

    struct objc_class {

        Class isa;

    #if !__OBJC2__

        Class super_class;

        const char *name;

        long version;

        long info;

        long instance_size;

        struct objc_ivar_list *ivars;

        struct objc_method_list **methodLists;

        struct objc_cache *cache;

        struct objc_protocol_list *protocols;

    #endif

    } OBJC2_UNAVAILABLE;

     

    id 的定义

    typedef struct objc_object {

        Class isa;

    } *id;

     

    SEL 的定义

    typedef struct objc_selector    *SEL;

    在源码中没有直接找到 objc_selector 的定义,从一些书籍上与 Blog 上看到可以将 SEL 理解为一个 char* 指针,经过自己测试是正确的。但是可以猜测到 struct objc_selector 的定义为:

    struct objc_selector  {

    char name[64 or ...];

    ...

    };

    只要遵循如上原型,就可以将 SEL 理解为一个 char*。大家可能考虑 name 会不会是在Heap上呢?基于如下三个理由,我认为不会在Heap上:第一、name 在编译时就确定了,在加载编译链接后文件时直接放到静态存储区就可以了;第二、通过用 IDA 反汇编Mach-O 文件,可以以字符串的形式看到所有方法;第三、虽然现在编译器支持很长的方法名,但基本都有一个固定长度(参考C99标准)。

     

    IMP 的定义

    typedef id           (*IMP)(id, SEL, ...);

    IMP 是一个函数指针,而且从原型上可以看出跟用 C 语言模仿面向对象特性很像,比如:C++Python 等,第一参数都是 self


  • 相关阅读:
    17. Letter Combinations of a Phone Number java solutions
    43. Multiply Strings java solutions
    3. Longest Substring Without Repeating Characters java solutions
    51. N-Queens java solutions
    74. Search a 2D Matrix java solutions
    48. Rotate Image java solutions
    64. Minimum Path Sum java solutions
    leetcode : Container With Most Water
    leetcode : reverse integer
    leetcode : ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/Proteas/p/2820205.html
Copyright © 2011-2022 走看看