swift-類屬性

了解屬性之前,需要先了解前面的swift-類結(jié)構(gòu)內(nèi)容 - swift-類結(jié)構(gòu)源碼探尋

FieldDescriptor

TargetClassDescriptor {
    var Flags: ContextDescriptorFlags  // uint32
    var Parent: TargetRelativeContextPointer // Int32
    var Name: TargetRelativeDirectPointer // Int32
    var AccessFunctionPtr: TargetRelativeDirectPointer // Int32
    var Fields: FieldDescriptor // Int32
    var SuperclassType: TargetRelativeDirectPointer // Int32
    var MetadataNegativeSizeInWords: uint32_t
    var MetadataPositiveSizeInWords: uint32_t
    var NumImmediateMembers: uint32_t
    var NumFields: uint32_t
    var FieldOffsetVectorOffset: uint32_t
    var VTableOffset: uint32_t
    var VTableSize: uint32_t
    // ......... VTable部分
}

其中 Fields 記錄了當前的屬性信息, 源碼結(jié)構(gòu)如下

// Field descriptors contain a collection of field records for a single
// class, struct or enum declaration.
struct FieldDescriptor {
    MangledTypeName int32
    Superclass int32  
    Kind uint16  
    FieldRecordSize uint16 
    NumFields uint32  // 應(yīng)該就是多少個屬性了
}

并未發(fā)現(xiàn)有屬性,至此,如果是你的話,你會怎么繼續(xù)探究源碼來確定類的屬性結(jié)構(gòu)

按部就班,如果源碼沒有直給的信息,那就從給定的方法去找,總歸會有關(guān)聯(lián)的

image.png

繼續(xù) 搜索, 盲目搜搜了一圈,同時FieldDescriptor全局搜索 getFields(), 根據(jù)找到的內(nèi)容多屬于猜測的成分,不得不意識到,已經(jīng)迷失目標了

其實,回過頭來

image.png

熟悉的東西又來了

指針偏移,也就是 FieldDescriptor 結(jié)構(gòu)內(nèi)存 向下平移自己所占的內(nèi)存空間,得到 FieldRecord

FieldRecords 記錄了每個屬性的信息

struct FieldRecord {
    Flags uint32
    MangledTypeName int32
    FieldName int32
}

FieldRecord應(yīng)該就是目標了,有FieldName屬性,一個屬性自然一個FieldName,自然會有多個FieldRecords [FieldRecord]

補充 FieldDescriptor

struct FieldDescriptor {
    MangledTypeName int32
    Superclass int32  
    Kind uint16  
    FieldRecordSize uint16 
    NumFields uint32  // 應(yīng)該就是多少個屬性了
    FieldRecords [FieldRecord]
}

至于 最終屬性的獲取

image.png
image.png

image.png

內(nèi)存迭代器出現(xiàn)了

image.png

再次回看細節(jié)

多個FieldRecord 應(yīng)該是連續(xù)的

此時找到內(nèi)存塊的第一個 FieldRecord,

image.png

image.png

Flags 占用4字節(jié)內(nèi)存, 主要是起到標識作用

MangledTypeName 占4字節(jié)

FieldName 占4字節(jié)

在上面找到的第一個FieldRecord內(nèi)存基礎(chǔ)上,需要繼續(xù)偏移 兩個4字節(jié),第3個4字節(jié)為 屬性名稱,

其實 找到的FieldName 還不是 最終目標

RelativeDirectPointer<const char> FieldName, 這里是 name的相對偏移量

所以第3個4字節(jié)的位置 + 偏移量,最終得到目標屬性

類屬性與MachO

  • descriptor


    image.png

    0x7AC8 + 0xFFFFDF60 = 0x100005A28

    0x100005A28 - 虛擬基址0x100000000 = 0x5A28

  • descriptor內(nèi)存

image.png

0x5A38 + 0x2010 = 0x7A48

  • FieldDescriptor內(nèi)存


    image.png

0x7A48 + 4個4字節(jié) = 0x7A58

0x7A58 開始,偏移到第3個4字節(jié)即為 FileRecord.FieldName

0x7A60 + 0xFFFFFFB3 = 0x100007A13

0x100007A13 - 虛擬基址0x100000000 = 0x7A13
  • FieldName 內(nèi)存


    image.png

swift-類屬性-MachO讀取

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift進階-類與結(jié)構(gòu)體[http://www.itdecent.cn/p/347bafbb3cf8]Swif...
    頂級蝸牛閱讀 761評論 0 4
  • 高級語言swift開發(fā)者了解源碼,如何著手呢? 下載源碼那是肯定的,官網(wǎng)鏈接[https://www.swift....
    erlich閱讀 1,758評論 0 1
  • 一.存儲屬性 存儲屬性是一個作為特定類和結(jié)構(gòu)體實例一部分的常量或變量.存儲屬性要么是變量存儲屬性(由var關(guān)鍵字引...
    劉國強閱讀 647評論 0 0
  • 本文主要是分析Mirror的底層實現(xiàn),以及根據(jù)Mirror底層原理仿寫其結(jié)構(gòu)的實現(xiàn) 在Swift-進階:反射Mir...
    輝輝歲月閱讀 498評論 0 0
  • 一.存儲屬性 存儲屬性是一個作為特定類和結(jié)構(gòu)體實例一部分的常量或變量。存儲屬性要么是變量存儲屬性(由var關(guān)鍵字引...
    MissStitch丶閱讀 677評論 0 0

友情鏈接更多精彩內(nèi)容