Runtime學習基礎(chǔ)之isa指針(終結(jié)篇)

如果您在看這篇博客時候,還沒看過我上一篇博客,需要您去耐心的看一下,有助于更快更好的理解這篇博客的內(nèi)容Runtime學習基礎(chǔ)之isa指針

好,我們繼續(xù)上篇博客繼續(xù)說:我們先用結(jié)構(gòu)體解決這個問題

,請看下面的代碼

這里我們定義一個結(jié)構(gòu)體,里面存儲3個參數(shù),我們看一下結(jié)果能不能解決這個問題:請看下面的代碼截圖


這個明顯是解決了情況,大家可以嘗試其他情況,接下來,我們就引入今天最重要的模塊,就是共同體union

首先我們先看我們這個需求怎么用共用體union來解決,這里我直接寫結(jié)果,等會再一起討論蘋果的源碼,它也是這么來解決的,因為我們還知道,位運算效率是非常高的,所以請看下圖:

這個也可以很好的解決問題,至于結(jié)果我就不截圖了,大家可以試試,肯定是可以解決這個問題,另外,我上圖的綠色部分是可以注釋的,也就是有沒有綠色都是成功的,說明,綠色部分就是類似一個注解給給我們自己可以看得清楚.

蘋果源碼解讀

好了,有了上面的基礎(chǔ),相信我們很容易理解蘋果的源碼了,我們現(xiàn)在去看看.因為它的實現(xiàn)就是objc_object 我們搜索這個就能找到.

我們先來看下蘋果的源碼,因為我們知道,蘋果的arm64以后對isa做了一些優(yōu)化,之前的class里面只有一個isa指針,從之前我們學習的,一個isa是8bit也就是64位,明顯用這么多位存儲一個isa是有些浪費,所以就加了很多其他的東西,我們先看源碼如下圖:

上面的點進去看看截圖,也就是箭頭指的那個struct結(jié)構(gòu)體里面的ISA_BITFIELD這個

我們是找arm64對應(yīng)的,看看圖上的藍色的,是不是非常熟悉,跟我們定義的一摸一樣的方法,這里我把綠色框框里面的東西是做什么的,全部寫出來了,大家可以看看

我們知道一個isa是占用8bit也就是64位,我們看看上面用了多少位1+1+1+33+6+1+1+1+19=64正好是64全部用上了

現(xiàn)在我們來驗證之前的一個問題,在這個博客中寫到深入探究對象的isa指針指向哪里

請看下面截圖

之前的博客是直接寫,并沒有證明是為什么.現(xiàn)在說一下,

證明獲取isa為什么要&ISA_MASK

由這2篇博客,大家知道怎么去取某個位上的數(shù)字了吧,比如我現(xiàn)在想知道isa里面的nonpointer是多少,我們是不是很好取出來,我們直接拿到這個這個地址&1是不是就行了?對吧

那我們之前&ISA_MASK掩碼大家知道為什么了吧,現(xiàn)在我們來看看這個掩碼是多少,我們猜測肯定是前三位是000,后面是33個1,因為是取出33位,好我們?nèi)タ纯词遣皇?,先看ISA_MASK是多少

,我們用計算器看一下2進制是多少

這個二進制算出來,對應(yīng)的正好33個1,所以&這個掩碼,正好可以取出isa的cls的地址,這下大家知道為什么要&這個掩碼才能取出這個值吧!

那我們現(xiàn)在就看一個我上個博客說的,cls的后三位永遠是0

isa的內(nèi)存地址中,后三位永遠是0

其實上面已經(jīng)證明了,下面我們就來看看(大家記得用真機運行測試比較嚴謹,因為是arm64),我這邊就不用真機了,大家看一下就行了

好了,相信到這里,上篇博客的四個問題都是可以解答的了,對于isa相信大家比之前的理解更深刻了,如果面試官問isa相信你更能答到本質(zhì)!

拓展

其實我們位運行有很多值,比如我們的枚舉值,我們在iOS開發(fā)中,我們在傳枚舉值中的任何一個或者多個,蘋果底層是怎么知道我們傳入的是哪一個呢?這個就是用到位運算來處理的,具體的大家可以自己寫一個demo測試

我們要想更好的學習runtime,我們還要學習class的類結(jié)構(gòu),也要清楚知道內(nèi)部是什么樣的,這樣才能學好runtime,雖然比較枯燥,但是很有用!

接下來博客我會介紹Runtime的class結(jié)構(gòu),來為更好的學習runtime打好基礎(chǔ)

如果覺得我寫得對您有所幫助缀踪,請關(guān)注我悉默,我會持續(xù)更新??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逸吵,隨后出現(xiàn)的幾起案子损肛,更是在濱河造成了極大的恐慌厢破,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件治拿,死亡現(xiàn)場離奇詭異摩泪,居然都是意外死亡,警方通過查閱死者的電腦和手機劫谅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門见坑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捏检,你說我怎么就攤上這事荞驴。” “怎么了未檩?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵戴尸,是天一觀的道長。 經(jīng)常有香客問我冤狡,道長孙蒙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任悲雳,我火速辦了婚禮挎峦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘合瓢。我一直安慰自己坦胶,他們只是感情好,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布晴楔。 她就那樣靜靜地躺著顿苇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪税弃。 梳的紋絲不亂的頭發(fā)上纪岁,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音则果,去河邊找鬼幔翰。 笑死漩氨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的遗增。 我是一名探鬼主播叫惊,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼做修!你這毒婦竟也來了霍狰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤缓待,失蹤者是張志新(化名)和其女友劉穎蚓耽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旋炒,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡步悠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘫镇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼎兽。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖铣除,靈堂內(nèi)的尸體忽然破棺而出谚咬,到底是詐尸還是另有隱情,我是刑警寧澤尚粘,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布择卦,位于F島的核電站,受9級特大地震影響郎嫁,放射性物質(zhì)發(fā)生泄漏秉继。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一泽铛、第九天 我趴在偏房一處隱蔽的房頂上張望尚辑。 院中可真熱鬧,春花似錦盔腔、人聲如沸杠茬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓢喉。三九已至,卻和暖如春舀透,著一層夾襖步出監(jiān)牢的瞬間栓票,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工盐杂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逗载,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓链烈,卻偏偏與公主長得像厉斟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子强衡,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容