Почему objc_class имеет разные определения между runtime.h и obj c -runtime-new.h - PullRequest
1 голос
/ 04 марта 2020

Моя загадка заключается в том, как компилятор может скомпилировать эти две структуры с одинаковыми именами.

Определение objc_class в "objc / runtime.h", которое открыто для разработчиков

struct objc_class {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class _Nullable super_class                              OBJC2_UNAVAILABLE;
    const char * _Nonnull name                               OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

, но заголовки проекта Файл "obj c -runtime-new.h" имеет другое определение (переменные-члены и функции).

struct objc_class : objc_object {
    // Class ISA;
    Class superclass;
    cache_t cache;             // formerly cache pointer and vtable
    // class_data_bits_t 
    class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags

    class_rw_t *data() {

        return bits.data();
    }
    void setData(class_rw_t *newData) {
        bits.setData(newData);
    }

    …

    …

};

Я не понимаю, как преобразованы эти две структуры.

1 Ответ

2 голосов
/ 05 марта 2020

Одним из них является то, что вы видите при использовании среды выполнения из вашего кода. Другой - то, что среда выполнения использует внутренне как деталь реализации.

Обратите внимание, что в обоих случаях первый слот является isa (хотя objc-runtime-new.h эффективно наследует этот слот от objc_object), а второй Слот - это superclass.

. Это единственные два слота, доступные вне среды выполнения. Внутри среды выполнения структура имеет больше записей для остальных метаданных, связанных с классом.

...