OC에 능숙한 사람은 위의 그림을 잘 알고 있어야합니다. 예, 이것은 Apple의 공식 인스턴스 객체, 클래스 및 메타 클래스 관계 다이어그램입니다. isa, superclass 및 metaclass 간의 관계를 생생하게 보여줍니다. 상속 관계
OC 클래스의 구현 원리를 살펴보면 OC 클래스가 objc_class에서 상속되고 NSObject가 OC 유형이며 objc_object가 c 유형임을 알 수 있습니다.
구조 유형 objc_class는 objc_object 유형에서 상속됩니다. 여기서 objc_object도 구조이고 isa 속성을 가지고 있으므로 objc_class도 isa 속성을 갖습니다.
NSObject의 isa는 맨 아래에있는 Class에 의해 정의되고, 클래스의 맨 아래 코드는 objc_class 유형에서 제공되므로 NSObject도 isa 속성을 갖습니다.
NSObject는 클래스입니다. 인스턴스 객체 objc를 초기화하는 데 사용합니다 .objc는 주로 objc_object의 특성 (즉, isa 속성을 가짐)을 충족합니다. 주로 isa는 NSObject에 의해 objc_class에서 상속되고 objc_class는 objc_object에서 상속되고 objc_object에는 isa가 있습니다. 속성. 따라서 객체에는 isa가 있습니다. 즉, 현재 objc_object를 가리 킵니다.
objc_object는 현재 루트 개체이고 모든 개체에는 이러한 특성 objc_object가 있습니다. 즉, isa 속성이 있습니다.
TargetHeapMetadata 및 TargetMetaData의 정의에서 초기화 메서드의 매개 변수 종류 유형이 MetadataKind임을 알 수 있습니다.
MetadataKind 정의를 입력하면 #include "MetadataKind.def"가 있습니다. 클릭하여 입력하면 모든 유형의 메타 데이터를 기록합니다.
TargetMetaData 구조 정의로 돌아가서 getClassObject 메서드를 찾습니다.이 메서드에서 종류와 일치하면 반환 값은 TargetClassMetadata 유형입니다. Class 인 경우이 (현재 포인터, 즉 메타 데이터)를 ClassMetadata로 직접 강제 적용합니다.
const TargetClassMetadata<Runtime>*getClassObject()const;
template<>inlineconst ClassMetadata *
Metadata::getClassObject()const{
// 匹配kindswitch(getKind()){
// 如果kind是classcase MetadataKind::Class:{
// Native Swift class metadata is also the class object.// 将当前指针强转为ClassMetadata类型return static_cast<const ClassMetadata *>(this);}case MetadataKind::ObjCClassWrapper:{
// Objective-C class objects are referenced by their Swift metadata wrapper.auto wrapper = static_cast<const ObjCClassWrapperMetadata *>(this);return wrapper->Class;}// Other kinds of types don't have class objects.default:return nullptr;}}
따라서 메모리 구조에서 포인터를 직접 변환 할 수 있으므로 TargetMetadata와 TargetClassMetadata는 본질적으로 동일하므로 구조가 실제로 TargetClassMetadata라고 간주 할 수 있습니다.
TargetAnyClassMetadata에서 상속 된 TargetClassMetadata 정의를 입력하면 클래스 구조의 일부인 다음 속성이 있습니다.