ClassMetadata的内存布局
概述
ClassMetadata = Class的TypeMetadata
- Class的TypeMetadata
- [+0x00] = var kind: Int
- [+0x08] = var superClass: UnsafeMutablePointer
- [+0x10] = Int cacheData[2]
- [+0x20] = var data: Int
- [+0x28] = var classFlags: Int32
- [+0x2C] = var instanceAddressPoint: UInt32
- [+0x30] = var instanceSize: UInt32
- [+0x34] = var instanceAlignmentMask: UInt16
- [+0x36] = var reserved: UInt16
- [+0x38] = var classSize: UInt32
- [+0x3C] = var classAddressPoint: UInt32
- [+0x40] = var typeDescriptor: UnsafeMutablePointer
- [+0x48] = var iVarDestroyer: UnsafeMutablePointer
struct TargetClassDescriptor
- struct TargetClassDescriptor
- [+0x00] = var flags: UInt32
- [+0x04] = var parent: TargetRelativeDirectPointer
- [+0x08] = var name: TargetRelativeDirectPointer
- [+0x0C] = var accessFunctionPointer: TargetRelativeDirectPointer
- [+0x10] = var fieldDescriptor: TargetRelativeDirectPointer
- [+0x14] = var superClassType: TargetRelativeDirectPointer
- [+0x18] = Int32 Union
- var ResilientMetadataBounds: RelativeDirectPointer
- var metadataNegativeSizeInWords: UInt32
- var ResilientMetadataBounds: RelativeDirectPointer
- [+0x1C] = Int32 Union
- var extraClassFlags: ExtraClassDescriptorFlags
- var metadataPositiveSizeInWords: UInt32
- [+0x20] = var numImmediateMembers: UInt32
- [+0x24] = var numFields: UInt32
- [+0x28] = var fieldOffsetVectorOffset: UInt32
- [+0x2C] = var Offset: UInt32
- [+0x30] = var size: UInt32
- [+0x34] = var firstVtableData: VTableBuffer
详解
Swift中类的继承关系
- Swift中类的继承关系
- 详解
- TargetClassMetadataType == ClassMetadata
- = TargetClassMetadata
>
- = TargetClassMetadata
- TargetClassMetadataObjCInterop
- = TargetClassMetadata
>
- = TargetClassMetadata
- ->
- TargetAnyClassMetadataType
- ObjCInterop=true == 兼容ObjC类 == 支持Objective-C类互操作
- TargetAnyClassMetadataObjCInterop
- ObjCInterop=false == 不兼容ObjC类
- TargetAnyClassMetadata
- ObjCInterop=true == 兼容ObjC类 == 支持Objective-C类互操作
- TargetAnyClassMetadataObjCInterop
- TargetAnyClassMetadata
- TargetClassMetadata
- TargetAnyClassMetadataVariant
- ->
- TargetAnyClassMetadata
- TargetHeapMetadata == HeapMetadata
- TargetMetadata
- TargetHeapMetadata == HeapMetadata
- TargetClassMetadataType == ClassMetadata
- 概述
- ClassMetadata
- TargetClassMetadata
- TargetAnyClassMetadataObjCInterop
- TargetAnyClassMetadata
- TargetHeapMetadata
- TargetMetadata
- TargetHeapMetadata
- TargetAnyClassMetadata
- TargetAnyClassMetadataObjCInterop
- TargetClassMetadata
- ClassMetadata
- 详解
Swift中的:ClassMetadata 字段定义
- Swift中的:ClassMetadata 字段定义
- TargetMetadata
- var kind: Int
- 在oc中放的就是isa,在swift中kind大于0x7FF表示的就是类
- var kind: Int
- TargetHeapMetadata
- 没属性=字段
- TargetAnyClassMetadata
- var superClass: UnsafeMutablePointer
- 父类的Metadata,如果是null说明是最顶级的root类了
- var superClass: UnsafeMutablePointer
- TargetAnyClassMetadataObjCInterop
- Int cacheData[2]
- 缓存数据用于某些动态查找,它由运行时拥有,通常需要与Objective-C的使用进行互操作。(说到底就是OC的东西)
- var data: Int
- 除了编译器设置低位以表明这是Swift元类型(因此存在对应的类型元数据的头信息)外,这个data里存的指针,用于行外元数据,通常是不透明的(应该也是OC的)
- Int cacheData[2]
- TargetClassMetadata
- var classFlags: Int32
- Swift-specific class flags
- var instanceAddressPoint: UInt32
- The address point of instances of this type
- var instanceSize: UInt32
- The required size of instances of this type.(实例对象在堆内存的大小)
- var instanceAlignmentMask: UInt16
- The alignment mask of the address point of instances of this type. (根据这个mask来获取内存中的对齐大小)
- var reserved: UInt16
- Reserved for runtime use.(预留给运行时使用)
- var classSize: UInt32
- The total size of the class object, including prefix and suffix extents.
- var classAddressPoint: UInt32
- The offset of the address point within the class object.
- var typeDescriptor: UnsafeMutablePointer
- 一个对类型的超行的swift特定描述,如果这是一个人工子类,则为null。目前不提供动态创建非人工子类的机制。
- var iVarDestroyer: UnsafeMutablePointer
- 销毁实例变量的函数,用于在构造函数早期返回后进行清理。如果为null,则不会执行清理操作,并且所有的ivars都必须是简单的。
- var classFlags: Int32
- TargetMetadata
struct TargetClassDescriptor
- struct TargetClassDescriptor
- var flags: UInt32
- 存储在任何上下文描述符的第一个公共标记
- var parent: TargetRelativeDirectPointer
- 复用的RelativeDirectPointer这个类型,其实并不是,但看下来原理一样;
- 父级上下文,如果是顶级上下文则为null
- var name: TargetRelativeDirectPointer
- 获取类的名称
- var accessFunctionPointer: TargetRelativeDirectPointer
- 这里的函数类型是一个替身,需要调用getAccessFunction()拿到真正的函数指针(这里没有封装),会得到一个MetadataAccessFunction元数据访问函数的指针的包装器类,该函数提供operator()重载以使用正确的调用约定来调用它(可变长参数),意外发现命名重整会调用这边的方法(目前不太了解这块内容)。
- var fieldDescriptor: TargetRelativeDirectPointer
- 一个指向类型的字段描述符的指针(如果有的话)。类型字段的描述,可以从里面获取结构体的属性。
- var superClassType: TargetRelativeDirectPointer
- The type of the superclass, expressed as a mangled type name that can refer to the generic arguments of the subclass type.
- Int32 Union (下面两个属性在源码中是union类型,所以取size大的类型作为属性(这里貌似一样),具体还得判断是否have a resilient superclass)
- var ResilientMetadataBounds: RelativeDirectPointer
- 有resilient superclass,用ResilientMetadataBounds,表示对保存元数据扩展的缓存的引用
- var metadataNegativeSizeInWords: UInt32
- 没有resilient superclass使用MetadataNegativeSizeInWords,表示该类元数据对象的负大小(用字节表示)
- var ResilientMetadataBounds: RelativeDirectPointer
- Int32 Union
- var extraClassFlags: ExtraClassDescriptorFlags
- 有resilient superclass,用ExtraClassFlags,表示一个Objective-C弹性类存根的存在
- var metadataPositiveSizeInWords: UInt32
- 没有resilient superclass使用MetadataPositiveSizeInWords,表示该类元数据对象的正大小(用字节表示)
- var extraClassFlags: ExtraClassDescriptorFlags
- var numImmediateMembers: UInt32
- 此类添加到类元数据的其他成员的数目。默认情况下,这些数据对运行时是不透明的,而不是在其他成员中公开;它实际上只是NumImmediateMembers sizeof(void)字节的数据。
- 这些字节是添加在地址点之前还是之后,取决于areImmediateMembersNegative()方法。
- var numFields: UInt32
- 属性个数,不包含父类的
- var fieldOffsetVectorOffset: UInt32
- 存储这个结构的字段偏移向量的偏移量(记录你属性起始位置的开始的一个相对于metadata的偏移量,具体看metadata的getFieldOffsets方法),如果为0,说明你没有属性
- 如果这个类含有一个弹性的父类,那么从他的弹性父类的metaData开始偏移
- var Offset: UInt32
- var size: UInt32 //VTable数量
- var firstVtableData: VTableBuffer
//VTable
- var flags: UInt32