源码
属性在Macho文件的位置信息¶
Metadata¶
Metadata 的元数据结构
struct Metadata{
var kind: Int
var superClass: Any.Type
var cacheData: (Int, Int)
var data: Int
var classFlags: Int32
var instanceAddressPoint: UInt32
var instanceSize: UInt32
var instanceAlignmentMask: UInt16
var reserved: UInt16
var classSize: UInt32
var classAddressPoint: UInt32
var typeDescriptor: UnsafeMutableRawPointer//不管是`Class`,`Struct`,` Enum`都有自己的`Descriptor`,就是对类的一个详细描述。
var iVarDestroyer: UnsafeRawPointer
}
上一节课讲到方法调度的过程中我们认识了 typeDescriptor ,这里面记录了 V-Table 的相关信息,接下来我们需要认识一下 typeDescriptor 中的 fieldDescripto
struct TargetClassDescriptor{
var flags: UInt32
var parent: UInt32
var name: Int32//class名称,struct名称,enum名称。
var accessFunctionPointer: Int32
var fieldDescriptor: Int32
var superClassType: Int32
var metadataNegativeSizeInWords: UInt32
var metadataPositiveSizeInWords: UInt32
var numImmediateMembers: UInt32
var numFields: UInt32
var fieldOffsetVectorOffset: UInt32
var Offset: UInt32
var size: UInt32
//V-Table 函数表
}
fieldDescriptor¶
fieldDescriptor 记录了当前的属性信息,其中 fieldDescriptor 在源码中的结构如下:
struct FieldDescriptor {
MangledTypeName int32
Superclass int32
Kind uint16
FieldRecordSize uint16
NumFields uint32 //当前有多少个属性
FieldRecords [FieldRecord]//记录了每个属性的信息
}
FieldRecords 的结构体如下:
struct FieldRecord{
Flags uint32
MangledTypeName int32
FieldName int32
}