跳转至

源码

属性在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
}