Обмен технологиями

isa в Objective-C больше не является простым указателем на структуру.

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Узнайте больше о Objective-C isa структура памяти указателя

В Objective-C,isa Указатели — важный мост между объектами и классами. Это не только помогает системе времени выполнения идентифицировать тип объекта, но также участвует в некоторой оптимизации памяти и производительности.Эта статья подробно объяснитisa Структура памяти указателей, включая ее эволюцию в ранних и современных реализациях.

что isa указатель?

Каждый объект Objective-C имеет isa Указатель, указывающий на объект класса объекта.Объект класса сам по себе также является объектом, и егоisa Указатель указывает на объект метакласса.Объекты метакласса хранят методы класса и ихisa Указатель в конечном итоге указывает на корневой метакласс (обычноNSObject метакласс).

Рано isa структура указателя

В ранних реализациях Objective-Cisa Указатель просто указывает на структуру объектов класса. Вот типичный пример ранней реализации:

struct objc_object {
    Class isa; // 指向类对象的指针
};

typedef struct objc_class *Class; // Class 的本质是 objc_class 类型的结构体指针
struct objc_class {
    Class isa; // 指向元类对象的指针
    Class super_class; // 指向父类对象的指针
    // 其他类相关的元数据
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

В рамках этой структуры:

  • Объект isa Указатель указывает на объект класса.
  • объектоподобный isa Указатель указывает на объект метакласса.
  • объект метакласса isa Указатель указывает на корневой объект метакласса.

современный isa структура указателя

В 64-битных системах и современных средах выполнения Objective-C:isa Указатели были переработаны как более сложное объединение (union isa_t ), который содержит не только указатели на объекты классов, но также другие флаги и информацию для оптимизации использования памяти и производительности.Ниже приводитсяisa_t Упрощенный пример структуры:

union isa_t {
    isa_t() { }
    isa_t(uintptr_t value) : bits(value) { }

    Class cls; // 指向类对象的指针
    uintptr_t bits; // 包含位域信息的位模式

    struct {
        uintptr_t nonpointer        : 1;  // 是否启用优化的 non-pointer isa
        uintptr_t has_assoc         : 1;  // 是否有关联对象
        uintptr_t has_cxx_dtor      : 1;  // 是否有 C++ 析构函数
        uintptr_t shiftcls          : 33; // 类指针(经过位移和压缩)
        uintptr_t magic             : 6;  // 调试用的魔数
        uintptr_t weakly_referenced : 1;  // 是否被弱引用
        uintptr_t deallocating      : 1;  // 是否正在释放
        uintptr_t has_sidetable_rc  : 1;  // 是否有辅助引用计数表
        uintptr_t extra_rc          : 19; // 额外的引用计数
    };
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Объяснение поля структуры

  • неуказатель:инструктировать isa Является ли это типом без указателя (оптимизируйте структуру памяти, сохраните дополнительную информацию).
  • has_assoc: имеет ли объект связанные ссылки (ассоциативные ссылки).
  • has_cxx_dtor: имеет ли объект деструктор C++ и необходимо ли его вызывать.
  • shiftcls: Указатель класса, который хранит информацию о классе объекта (после смещения и сжатия).
  • магия: магическое число, используемое для отладки и проверки во время выполнения.
  • слабо_ссылающийся: указывает ли на объект слабая ссылка.
  • освобождение: освобождается ли объект.
  • has_sidetable_rc: хранится ли счетчик ссылок объекта во вспомогательной таблице (боковая таблица).
  • extra_rc: Дополнительный подсчет ссылок для оптимизации использования памяти.

Хранение и управление счетчиками ссылок

В ранних реализациях Objective-C счетчик ссылок обычно хранился непосредственно в объекте как часть его структуры. Например:

struct objc_object {
    Class isa; // 指向类对象的指针
    uintptr_t retainCount; // 引用计数
};
  • 1
  • 2
  • 3
  • 4

В современных средах выполнения Objective-C подсчет ссылок происходит через isa Управляется оптимизированная структура указателей и структура вспомогательных данных боковой таблицы.

  • Встроенный подсчет ссылок: Частичная информация о подсчете ссылок сохраняется в isa В оптимизированных структурах указателей, например.extra_rc поле.
  • Столик: когда количество ссылок превышает isa Если диапазон, который может представлять указатель, счетчик ссылок сохраняется во вспомогательной структуре данных, называемой боковой таблицей.

Современный isa Преимущества указателей

  • Оптимизация памяти: Сохраняя дополнительную информацию (например, количество ссылок, флаги) в isa В указателях сокращается доступ к другим областям памяти и повышается производительность.
  • Улучшения производительности: Операции чтения памяти сокращаются, поскольку за одно чтение памяти можно получить больше информации.
  • Более богатые метаданные: может содержать больше информации о времени выполнения, помогая повысить гибкость и эффективность среды выполнения.

Пример использования

Хотя разработчики часто не взаимодействуют напрямую с isa Указатели взаимодействуют, но понимание их структуры полезно для отладки и оптимизации производительности. Вот пример использования, который отображает тип объекта путем доступа к информации о его классе:

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface MyClass : NSObject
@end

@implementation MyClass
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MyClass *obj = [[MyClass alloc] init];
        Class cls = object_getClass(obj);
        NSLog(@"Class name: %s", class_getName(cls));
        
        // 访问 isa 指针信息(需要通过运行时函数)
        NSLog(@"isa pointer: %p", *(uintptr_t *)obj);
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Подведем итог

isa Указатели играют важную роль в среде выполнения Objective-C: от ранних простых указателей на объекты классов до современных сложныхisa_t структуру, которая помогает оптимизировать использование памяти и производительность.пониматьisa Эволюция указателей и структур памяти может помочь нам лучше понять механизм выполнения Objective-C и писать эффективный код.

Я надеюсь, что эта статья поможет вам глубже понять Objective-C. isa Структура памяти указателя. Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте сообщение для обсуждения.