Compartir tecnología

isa en Objective-C ya no es un simple puntero de estructura

2024-07-12

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

Más información sobre Objective-C isa estructura de memoria del puntero

En Objective-C,isa Los punteros son un puente importante entre objetos y clases. No solo ayuda al sistema de ejecución a identificar el tipo de objeto, sino que también participa en algunas optimizaciones de memoria y rendimiento.Este artículo explicará en profundidad.isa La estructura de memoria de los punteros, incluida su evolución en implementaciones tempranas y modernas.

qué es isa ¿puntero?

Cada objeto Objective-C tiene un isa Un puntero que apunta al objeto de clase de un objeto.El objeto de clase en sí también es un objeto, y suisa El puntero apunta a un objeto de metaclase.Los objetos de metaclase almacenan métodos de clase y susisa El puntero finalmente apunta a la metaclase raíz (generalmenteNSObject metaclase).

Temprano isa estructura de puntero

En las primeras implementaciones de Objective-C,isa El puntero simplemente apunta a una estructura de objetos de clase. A continuación se muestra un ejemplo típico de implementación temprana:

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

Bajo esta estructura:

  • Objeto isa El puntero apunta al objeto de clase.
  • como un objeto isa El puntero apunta al objeto de metaclase.
  • objeto de metaclase isa El puntero apunta al objeto de metaclase raíz.

moderno isa estructura de puntero

En sistemas de 64 bits y tiempos de ejecución modernos de Objective-C,isa Los punteros se rediseñaron como una unión más compleja (union isa_t ), que no solo contiene punteros a objetos de clase, sino también otros indicadores e información para optimizar el uso y el rendimiento de la memoria.Lo siguiente esisa_t Un ejemplo simplificado de una estructura:

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

Explicación del campo de estructura

  • no puntero:instruir isa Si es un tipo sin puntero (optimiza el diseño de la memoria, almacena información adicional).
  • tiene_asociación: Si el objeto tiene referencias asociadas (Referencias Asociativas).
  • tiene_cxx_dtor: Si el objeto tiene un destructor de C++ y es necesario llamar al destructor.
  • Cambios en el cls: Puntero de clase, que almacena la información de clase del objeto (después del desplazamiento y compresión).
  • magia: Número mágico utilizado para la depuración y verificación del tiempo de ejecución.
  • débilmente referenciado: si el objeto está señalado por una referencia débil.
  • desasignación: si el objeto se está liberando.
  • tiene_mesa_lateral_rc: Si el recuento de referencia del objeto se almacena en la tabla auxiliar (tabla auxiliar).
  • extra_rc: Recuento de referencias adicionales para optimizar el uso de la memoria.

Almacenamiento y gestión de recuentos de referencia.

En las primeras implementaciones de Objective-C, el recuento de referencias generalmente se almacenaba directamente en el objeto como parte de la estructura del objeto. Por ejemplo:

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

En los tiempos de ejecución modernos de Objective-C, el recuento de referencias se produce mediante isa Se gestiona la estructura optimizada de punteros y la estructura de datos auxiliares de la Side Table.

  • Recuento de referencias en línea: La información de recuento de referencia parcial se almacena en isa En estructuras optimizadas de punteros, p.extra_rc campo.
  • Mesa auxiliar: cuando el recuento de referencia excede isa Cuando el rango que puede representar un puntero, el recuento de referencia se almacena en una estructura de datos auxiliar llamada tabla lateral.

Moderno isa Ventajas de los punteros

  • Optimización de la memoria: Al almacenar más información (como recuentos de referencias, indicadores) en isa En los punteros, se reduce el acceso a otras áreas de la memoria y se mejora el rendimiento.
  • Mejoras de rendimiento: Operaciones de lectura de memoria reducidas porque se puede obtener más información en una lectura de memoria.
  • Metadatos más ricos: Puede contener más información sobre el tiempo de ejecución, lo que ayuda a mejorar la flexibilidad y la eficiencia del tiempo de ejecución.

Ejemplo de uso

Aunque los desarrolladores a menudo no interactúan directamente con isa Los punteros interactúan, pero comprender su estructura es útil para depurar y optimizar el rendimiento. A continuación se muestra un ejemplo de uso que muestra el tipo de un objeto accediendo a su información de clase:

#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

Resumir

isa Los punteros juegan un papel importante en el tiempo de ejecución de Objective-C, desde el simple apuntamiento inicial a objetos de clase hasta los complejos modernos.isa_t estructura, que ayuda a optimizar el uso y el rendimiento de la memoria.entenderisa La evolución de los punteros y las estructuras de memoria puede ayudarnos a comprender mejor el mecanismo de ejecución de Objective-C y escribir código eficiente.

Espero que este artículo pueda ayudarte a obtener una comprensión más profunda de Objective-C. isa Estructura de memoria de puntero. Si tiene alguna pregunta o sugerencia, deje un mensaje para discutir.