기술나눔

Objective-C의 isa는 더 이상 단순한 구조 포인터가 아닙니다.

2024-07-12

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

Objective-C에 대해 알아보기 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; // 指向父类对象的指针
    // 其他类相关的元数据
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

이 구조에서:

  • 물체 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; // 额外的引用计数
    };
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

구조 필드 설명

  • 비포인터:지시하다 isa 포인터가 아닌 유형인지 여부(메모리 레이아웃 최적화, 추가 정보 저장)
  • 연관있다: 객체에 연관된 참조(Associative References)가 있는지 여부입니다.
  • has_cxx_dtor: 개체에 C++ 소멸자가 있고 소멸자를 호출해야 하는지 여부입니다.
  • 쉬프트클스: 객체의 클래스 정보를 저장하는 클래스 포인터(변위 및 압축 후).
  • 마법: 디버깅 및 런타임 검증에 사용되는 매직넘버입니다.
  • 약하게 참조됨: 약한 참조가 개체를 가리키는지 여부입니다.
  • 할당 해제: 객체가 해제되는지 여부입니다.
  • 사이드테이블이 있습니다: 해당 객체의 참조 카운트를 보조 테이블(사이드 테이블)에 저장하는지 여부.
  • 추가_rc: 메모리 사용 최적화를 위한 추가 참조 카운팅입니다.

참조 횟수 저장 및 관리

초기 Objective-C 구현에서 참조 횟수는 일반적으로 객체 구조의 일부로 객체에 직접 저장되었습니다. 예를 들어:

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

최신 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

요약하다

isa 포인터는 클래스 객체를 가리키는 초기의 단순 포인팅부터 현대의 복잡한 포인팅에 이르기까지 Objective-C 런타임에서 중요한 역할을 합니다.isa_t 메모리 사용량과 성능을 최적화하는 데 도움이 되는 구조입니다.이해하다isa 포인터와 메모리 구조의 발전은 Objective-C의 런타임 메커니즘을 더 잘 이해하고 효율적인 코드를 작성하는 데 도움이 될 수 있습니다.

이 기사가 Objective-C에 대한 더 깊은 이해를 얻는 데 도움이 되기를 바랍니다. isa 포인터 메모리 구조. 질문이나 제안사항이 있으시면 토론을 위해 메시지를 남겨주세요.