竇術(shù)堯 趙延超 張明瑞 劉煜 閏藝丹
摘要 針對常用的技術(shù)點進行源碼剖析,分析Runt ime數(shù)據(jù)結(jié)構(gòu)的底層實現(xiàn)原理。本論文所采用的底層源碼基于objc-runtime-680版本。
【關(guān)鍵詞】iOS Runtime
1 前言
為了更好的優(yōu)化APP,提高用戶量,就要從底層出發(fā),分析源碼,熟練掌握其原理,并將其應(yīng)用到實踐當(dāng)中。2相關(guān)技術(shù)
分析Runtime的底層數(shù)據(jù)結(jié)構(gòu)中每一項含義。如圖1所示。
(1) objc_object:該對象包含了一個isa指針,這也就是其為對象的標志。
(2) isa指針:分為兩種,一種是純指針型isa指針,第二種是非指針型isa指針(可以進行內(nèi)存管理),isa指針的底層是一個64位的二進制。
indexed位:第1位,如果為O則表示純isa指針,如果是1則表示非指針型isa指針。
has assoc位:第2位,如果是O則表示無關(guān)聯(lián)對象,如果是l則表示有關(guān)聯(lián)對象。
has cxx dtor位:第3位,當(dāng)前對象是否使用c++代碼,在ARC下,表示該對象是通過使用ARC進行管理。
shiftcls位:第4到36位,即有32位,表示當(dāng)前對象的類對象的指針地址,實際的是值是ISA MASK,通過這個值與isa做與運算,能夠找到該對象的bits t對象。
maglc位:第37到42位,即有6位,加載鏡像,具體的加載會在分類中討論。
weakly_referenced位:第43位,表示該對象是否有相應(yīng)的弱引用指針。
deallocating位:第44位,表示當(dāng)前isa所存儲的引用計數(shù)如果達到上限的話,需外空一個sidetable存儲相關(guān)的引用計數(shù)內(nèi)容,即散列表。
extra re位:第46到64位,額外的引用計數(shù)(當(dāng)引用計數(shù)在一個很小值時使用)。
(3) cache t:它的作用緩存方法,用來快速查找方法的執(zhí)行函數(shù),是可增量擴展的哈希表結(jié)構(gòu),也是局部性原理的最佳應(yīng)用。
(4) class_data_bits_t:①主要是對*rw t的封裝;②+rw t代表了類的讀寫信息,對*ro t的封裝;⑧* ro t代表了類的只讀信息。
(5)class ro t①name:該類對象的名稱②1vars: 一維數(shù)組,包含實例變量;⑧其余都是一維數(shù)組,包含了該類的屬性、協(xié)議、方法(類對象和元類對象分別包含對象方法、類對象方法。
(6) class rwt:①class ro t;②其他三項都是二維數(shù)組,可以動態(tài)的根據(jù)分類名稱添加協(xié)議、屬性、方法。
(7) method_:class_rw_t中的methods是一個二維數(shù)組,其每一項都是一個根據(jù)名稱動態(tài)添加的數(shù)組,該數(shù)組的每一項都是method_ t。
其中函數(shù)的四要素:①名稱SELName②返回值⑧參數(shù)④函數(shù)體(IMP imp)
3 結(jié)論
本文從底層源碼出發(fā),分析了每一部分的作用.并會在不斷的探索和實踐中進步,逐漸完成對項目的優(yōu)化和自身的進階。
參考文獻
[1] Gaurav Vaish.高性能iOS應(yīng)用開發(fā)[M].北京:人民郵電出版社,2016.