日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

iOS runtime再学习

發(fā)布時(shí)間:2023/12/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS runtime再学习 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

iOS面試專題一
幾乎是默寫(xiě)出來(lái),加上自己理解的博客(iOS面試)

持續(xù)更新中。。。

問(wèn)題:當(dāng)方法轉(zhuǎn)發(fā)到另一個(gè)類的對(duì)象的時(shí)候,另一個(gè)類沒(méi)有對(duì)應(yīng)的屬性怎么辦,會(huì)崩潰嗎?

文章目錄

  • 1.基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)
  • 2.對(duì)象,類對(duì)象,元類對(duì)象
  • 3.消息傳遞,方法查找
  • 4.消息轉(zhuǎn)發(fā),動(dòng)態(tài)方法解析
  • 5.runtime的使用

  • 運(yùn)行時(shí)runtime
  • 編譯:將高級(jí)語(yǔ)言翻譯成計(jì)算機(jī)能聽(tīng)懂的二進(jìn)制語(yǔ)言
  • 運(yùn)行:計(jì)算機(jī)開(kāi)始執(zhí)行這些二進(jìn)制語(yǔ)言所記錄的內(nèi)容

oc是一門動(dòng)態(tài)語(yǔ)言,它將盡可能多的決策從編譯時(shí)和鏈接時(shí)推遲到運(yùn)行時(shí)。這意味著它不僅需要一個(gè)編譯器,還需要一個(gè)運(yùn)行時(shí)系統(tǒng)來(lái)執(zhí)行編譯后的代碼,也就是runtime

Messaging(消息機(jī)制):消息傳遞,方法查找

  • 消息(方法聲明)直到運(yùn)行時(shí)才綁定到方法實(shí)現(xiàn)。編譯器將消息表達(dá)式轉(zhuǎn)換為對(duì)消息傳遞函數(shù)objc_msgSend的調(diào)用。這個(gè)函數(shù)接收消息中提到的接收方和方法的名稱(方法選擇器)作為它的兩個(gè)主要參數(shù),消息中傳遞的任何參數(shù)也會(huì)傳遞給objc_msgSend

消息傳遞函數(shù)objc_msgSend完成動(dòng)態(tài)綁定所需的一切

  • 找到IMP --> 調(diào)用IMP --> 返回返回值
  • 一個(gè)類分派表。這個(gè)表中有一些條目,它們將方法選擇器與它們所標(biāo)識(shí)的方法的特定于類的地址相關(guān)聯(lián)

消息轉(zhuǎn)發(fā),動(dòng)態(tài)方法解析

  • resoleveInstanceMethode
  • forwardingTargetForSelector
  • methodSignatureForSelector, forwardInvacation

runtime使得閉源的iOS變?yōu)殚_(kāi)源,獲取系統(tǒng)類的私有屬性,方法和成員變量。用kvc賦值,用runtime調(diào)用方法

  • oc的方法調(diào)用,實(shí)際上就是給對(duì)象發(fā)消息
  • 在運(yùn)行時(shí)選擇方法的實(shí)現(xiàn) – 方法(IMP)被動(dòng)態(tài)地綁定到消息(SEL)

1.基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)

  • cache_t
  • bucket_t:key(SEL),IMP
  • 用于快速查找方法執(zhí)行函數(shù)
  • 是可增量擴(kuò)展的哈希表結(jié)構(gòu)
  • 是局部性原理的最佳應(yīng)用
  • class_rw_t - methods: 二維數(shù)組,一個(gè)類可能有多個(gè)分類。 readwrite
  • class-ro_t - methods: 一維數(shù)組,readonly
  • isa指針 指針型:isa的值代表Class的地址。 非指針型:isa的值的部分代表Class的地址
  • method_t 函數(shù)四要素:名稱(SEL),參數(shù),返回值,函數(shù)體(IMP)
  • Type Encodings V-void @-id : - SEL

2.對(duì)象,類對(duì)象,元類對(duì)象

  • 類對(duì)象存儲(chǔ)實(shí)例方法列表等信息
  • 元類對(duì)象存儲(chǔ)類方法列表等信息
  • 根元類對(duì)象的父類是根類,所有NSObject類對(duì)象可以調(diào)用實(shí)例對(duì)象的方法

3.消息傳遞,方法查找

  • objc_msgSend(id self, SEL _cmd), 消息傳遞轉(zhuǎn)化為了函數(shù)調(diào)用
  • [super class]:objc_msgSendSuper(super,@selector(class)), 從父類的方法列表開(kāi)始尋找,返回的還是self的類對(duì)象,是向self發(fā)消息
  • 消息的傳遞過(guò)程(機(jī)制)

4.消息轉(zhuǎn)發(fā),動(dòng)態(tài)方法解析

  • 動(dòng)態(tài)方法解析(Dynamic Method Resolution)
  • resolveInstanceMethod:動(dòng)態(tài)添加方法的實(shí)現(xiàn)
  • 消息轉(zhuǎn)發(fā)(Message Forwarding):轉(zhuǎn)發(fā)到其他對(duì)象的同名方法
  • forwardingTargetForSelector(Fast forwarding):轉(zhuǎn)發(fā)給別的對(duì)象去實(shí)現(xiàn)
  • Normal forwarding:可以轉(zhuǎn)發(fā)到本對(duì)象的其他方法,也可以轉(zhuǎn)發(fā)到其他的對(duì)象的其他方法
  • methodSignatureForSelector: 方法簽名
  • forwardInvocation: 方法實(shí)現(xiàn)(調(diào)用)

  • Method-Swizzling

5.runtime的使用

  • 可以使得閉源的iOS變?yōu)殚_(kāi)源,獲取系統(tǒng)類的私有屬性,方法和成員變量。用kvc賦值

iOS runtime 動(dòng)態(tài)攔截方法,設(shè)置參數(shù) tableView改變索引欄的字體大小和顏色

總結(jié)

以上是生活随笔為你收集整理的iOS runtime再学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。