le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
isa
struttura della memoria del puntatoreNell'Obiettivo C,isa
I puntatori sono un importante ponte tra oggetti e classi. Non solo aiuta il sistema runtime a identificare il tipo di oggetto, ma partecipa anche ad alcune ottimizzazioni della memoria e delle prestazioni.Questo articolo spiegherà in modo approfonditoisa
La struttura della memoria dei puntatori, inclusa la sua evoluzione nelle implementazioni antiche e moderne.
isa
puntatore?Ogni oggetto Objective-C ha a isa
Puntatore che punta all'oggetto classe di un oggetto.Anche l'oggetto classe stesso è un oggetto, e il suo fileisa
Il puntatore punta a un oggetto meta-classe.Gli oggetti Metaclass memorizzano i metodi delle classi e i loro fileisa
Il puntatore punta infine alla metaclasse radice (solitamenteNSObject
metaclasse).
isa
struttura del puntatoreNelle prime implementazioni Objective-C,isa
Il puntatore punta semplicemente a una struttura di oggetti di classe. Ecco un tipico esempio di implementazione iniziale:
struct objc_object {
Class isa; // 指向类对象的指针
};
typedef struct objc_class *Class; // Class 的本质是 objc_class 类型的结构体指针
struct objc_class {
Class isa; // 指向元类对象的指针
Class super_class; // 指向父类对象的指针
// 其他类相关的元数据
};
Sotto questa struttura:
isa
Il puntatore punta all'oggetto della classe.isa
Il puntatore punta all'oggetto metaclasse.isa
Il puntatore punta all'oggetto metaclasse root.isa
struttura del puntatoreSui sistemi a 64 bit e sui moderni runtime Objective-C,isa
I puntatori sono stati ridisegnati come un'unione più complessa (union isa_t
), che non contiene solo puntatori a oggetti di classe, ma anche altri flag e informazioni per ottimizzare l'utilizzo e le prestazioni della memoria.Quello che segue èisa_t
Un esempio semplificato di struttura:
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
Se si tratta di un tipo non puntatore (ottimizza il layout della memoria, memorizza informazioni aggiuntive).Nelle prime implementazioni Objective-C, il conteggio dei riferimenti veniva solitamente archiviato direttamente nell'oggetto come parte della struttura dell'oggetto. Per esempio:
struct objc_object {
Class isa; // 指向类对象的指针
uintptr_t retainCount; // 引用计数
};
Nei moderni runtime Objective-C, il conteggio dei riferimenti avviene tramite isa
Viene gestita la struttura ottimizzata dei puntatori e la struttura dati ausiliari della Side Table.
isa
In strutture ottimizzate di puntatori, ad es.extra_rc
campo.isa
Quando viene raggiunto l'intervallo che un puntatore può rappresentare, il conteggio dei riferimenti viene archiviato in una struttura dati ausiliaria denominata Side Table.isa
Vantaggi dei puntatoriisa
Nei puntatori l'accesso ad altre aree di memoria viene ridotto e le prestazioni migliorate.Sebbene gli sviluppatori spesso non interagiscano direttamente con isa
I puntatori interagiscono, ma comprenderne la struttura è utile per il debug e l'ottimizzazione delle prestazioni. Ecco un esempio di utilizzo che visualizza il tipo di un oggetto accedendo alle informazioni sulla sua classe:
#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
I puntatori svolgono un ruolo importante nel runtime Objective-C, dai primi semplici puntamenti agli oggetti di classe fino al complesso modernoisa_t
struttura, che aiuta a ottimizzare l'utilizzo e le prestazioni della memoria.capireisa
L'evoluzione dei puntatori e delle strutture di memoria può aiutarci a comprendere meglio il meccanismo di runtime di Objective-C e a scrivere codice efficiente.
Spero che questo articolo possa aiutarti ad acquisire una comprensione più profonda di Objective-C isa
Struttura della memoria del puntatore. Se hai domande o suggerimenti, lascia un messaggio per la discussione.