내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
isa
포인터 메모리 구조오브젝티브-C에서는,isa
포인터는 객체와 클래스 사이의 중요한 다리입니다. 이는 런타임 시스템이 객체 유형을 식별하는 데 도움이 될 뿐만 아니라 일부 메모리 및 성능 최적화에도 참여합니다.이 기사에서는 자세히 설명합니다.isa
초기 및 현대 구현의 진화를 포함한 포인터의 메모리 구조.
isa
바늘?모든 Objective-C 객체에는 isa
객체의 클래스 객체를 가리키는 포인터입니다.클래스 객체 자체도 객체이며,isa
포인터는 메타 클래스 개체를 가리킵니다.메타클래스 객체는 클래스 메소드를 저장하며,isa
포인터는 궁극적으로 루트 메타클래스를 가리킵니다(보통NSObject
메타클래스).
isa
포인터 구조초기 Objective-C 구현에서는isa
포인터는 단순히 클래스 객체의 구조를 가리킵니다. 다음은 일반적인 초기 구현 예입니다.
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
최적화된 포인터 구조와 Side Table 보조 데이터 구조를 관리합니다.
isa
포인터의 최적화된 구조에서, 예를 들어extra_rc
필드.isa
포인터가 나타낼 수 있는 범위일 때 참조 카운트는 Side Table이라는 보조 데이터 구조에 저장됩니다.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
포인터 메모리 구조. 질문이나 제안사항이 있으시면 토론을 위해 메시지를 남겨주세요.