Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
isa
estructura de memoria del punteroEn 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.
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).
isa
estructura de punteroEn 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; // 指向父类对象的指针
// 其他类相关的元数据
};
Bajo esta estructura:
isa
El puntero apunta al objeto de clase.isa
El puntero apunta al objeto de metaclase.isa
El puntero apunta al objeto de metaclase raíz.isa
estructura de punteroEn 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; // 额外的引用计数
};
};
isa
Si es un tipo sin puntero (optimiza el diseño de la memoria, almacena información adicional).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; // 引用计数
};
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.
isa
En estructuras optimizadas de punteros, p.extra_rc
campo.isa
Cuando el rango que puede representar un puntero, el recuento de referencia se almacena en una estructura de datos auxiliar llamada tabla lateral.isa
Ventajas de los punterosisa
En los punteros, se reduce el acceso a otras áreas de la memoria y se mejora el rendimiento.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;
}
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.