моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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; // 指向父类对象的指针
// 其他类相关的元数据
};
В рамках этой структуры:
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; // 额外的引用计数
};
};
isa
Является ли это типом без указателя (оптимизируйте структуру памяти, сохраните дополнительную информацию).В ранних реализациях Objective-C счетчик ссылок обычно хранился непосредственно в объекте как часть его структуры. Например:
struct objc_object {
Class isa; // 指向类对象的指针
uintptr_t retainCount; // 引用计数
};
В современных средах выполнения 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;
}
isa
Указатели играют важную роль в среде выполнения Objective-C: от ранних простых указателей на объекты классов до современных сложныхisa_t
структуру, которая помогает оптимизировать использование памяти и производительность.пониматьisa
Эволюция указателей и структур памяти может помочь нам лучше понять механизм выполнения Objective-C и писать эффективный код.
Я надеюсь, что эта статья поможет вам глубже понять Objective-C. isa
Структура памяти указателя. Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте сообщение для обсуждения.