Runtime API

runtime
  • runtime 概念
    Runtime 又叫運行時,是一套底層的 C 語言 API,其為 iOS 內(nèi)部的核心之一,我們平時編寫的 OC 代碼,底層都是基于它來實現(xiàn)的。
// 比如oc執(zhí)行下面代碼
[receiver message];
// 底層運行時會被編譯器轉(zhuǎn)化為:
objc_msgSend(receiver, selector)

// 如果其還有參數(shù)比如:
[receiver message:(id)arg...];
// 底層運行時會被編譯器轉(zhuǎn)化為:
objc_msgSend(receiver, selector, arg1, arg2, ...)
  • runtime理解
    以上你可能看不出它的價值,但是我們需要了解的是 Objective-C 是一門動態(tài)語言,它會將一些工作放在代碼運行時才處理而并非編譯時。也就是說,有很多類和成員變量在我們編譯的時是不知道的,而在運行時,我們所編寫的代碼會轉(zhuǎn)換成完整的確定的代碼運行。 因此,編譯器是不夠的,我們還需要一個運行時系統(tǒng)(Runtime system)來處理編譯后的代碼。 Runtime 基本是用 C 和匯編寫的,由此可見蘋果為了動態(tài)系統(tǒng)的高效而做出的努力。蘋果和 GNU 各自維護一個開源的 Runtime 版本,這兩個版本之間都在努力保持一致。

  • runtime作用

Objc 在三種層面上與 Runtime 系統(tǒng)進行交互:

1.通過 Objective-C 源代碼
2.通過 Foundation 框架的 NSObject 類定義的方法
3.通過對 Runtime 庫函數(shù)的直接調(diào)用
  1. 通過 Objective-C 源代碼

多數(shù)情況我們只需要編寫 OC 代碼即可,Runtime 系統(tǒng)自動在幕后搞定一切,還記得簡介中如果我們調(diào)用方法,編譯器會將 OC 代碼轉(zhuǎn)換成運行時代碼,在運行時確定數(shù)據(jù)結(jié)構(gòu)和函數(shù)。

2.通過 Foundation 框架的 NSObject 類定義的方法

 Cocoa 程序中絕大部分類都是 NSObject 類的子類,所以都繼承了 NSObject 的行為。(NSProxy 類時個例外,它是個抽象超類)
一些情況下,NSObject 類僅僅定義了完成某件事情的模板,并沒有提供所需要的代碼。例如 -description 方法,該方法返回類內(nèi)容的字符串表示,該方法主要用來調(diào)試程序。NSObject 類并不知道子類的內(nèi)容,所以它只是返回類的名字和對象的地址,NSObject 的子類可以重新實現(xiàn)。
還有一些 NSObject 的方法可以從 Runtime 系統(tǒng)中獲取信息,允許對象進行自我檢查。例如:
-class方法返回對象的類;
-isKindOfClass: 和 -isMemberOfClass: 方法檢查對象是否存在于指定的類的繼承體系中(是否是其子類或者父類或者當前類的成員變量);
-respondsToSelector: 檢查對象能否響應(yīng)指定的消息;
-conformsToProtocol:檢查對象是否實現(xiàn)了指定協(xié)議類的方法;
-methodForSelector: 返回指定方法實現(xiàn)的地址。

3.通過對 Runtime 庫函數(shù)的直接調(diào)用

Runtime 系統(tǒng)是具有公共接口的動態(tài)共享庫。頭文件存放
 于/usr/include/objc目錄下,這意味著我們使用時只需要引入objc/Runtime.h頭文件即可。

許多函數(shù)可以讓你使用純 C 代碼來實現(xiàn) Objc 中同樣的功能。除非是寫一些 Objc 與其他語言的橋接或是底層的 debug 工作,你在寫 Objc 代碼時一般不會用到這些 C 語言函數(shù)。對于公共接口都有哪些,后面會講到。我將會參考蘋果官方的 API 文檔。
最后編輯于
?著作權(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)容

  • OC是運行時語言,只有在程序運行時,才會去確定對象的類型,并調(diào)用類與對象相應(yīng)的方法。平時編寫的OC代碼, 在程序運...
    一個人在路上走下去閱讀 2,470評論 1 36
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,694評論 4 61
  • 清晨睜開眼,便忘了昨夜的夢。依稀還能想起是丟了一顆紐扣,抱著一穗玉米,上錯了一班飛機。話說“日有所思,夜有所...
    麥草店主閱讀 104評論 0 0
  • 酷暑季節(jié),天氣即潮濕又悶熱,是皮炎,濕疹,皮膚過敏等皮膚炎癥高發(fā)的時候。而且多發(fā)于暴露部位,如面部、頸部、手臂、手...
    風(fēng)致堂閱讀 726評論 0 0
  • 我家在農(nóng)村,父母是農(nóng)民,父親從爺爺那里分到了土地,不多不少,一畝三分。我不知道一畝三分究竟是多少,但外公告訴我,每...
    賦庸風(fēng)雅閱讀 2,612評論 0 1

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