Runtime 又叫運行時,是一套底層的 C 語言 API,其為 iOS 内部的核心之一,我們平時編寫的 OC 代碼,底層都是基于它來實現的。它會将一些工作放在代碼運行時才處理而并非編譯時。也就是說,有很多類和成員變量在我們編譯的時是不知道的,而在運行時,我們所編寫的代碼會轉換成完整的确定的代碼運行。
因此,編譯器是不夠的,我們還需要一個運行時系統(Runtime system)來處理編譯後的代碼。
Runtime 基本是用 C 和彙編寫的,由此可見蘋果為了動态系統的高效而做出的努力。蘋果和 GNU 各自維護一個開源的 Runtime 版本,這兩個版本之間都在努力保持一緻。
比如:
[receiver message]; // 底層運行時會被編譯器轉化為: objc_msgSend(receiver, selector) // 如果其還有參數比如: [receiver message:(id)arg...]; // 底層運行時會被編譯器轉化為: objc_msgSend(receiver, selector, arg1, arg2, ...)
objc_msgSend() 一般參數解析:
參數1:表示給哪個對象發送消息
參數2:表示給哪個方法發送消息(也是方法編号,一般通過編号找到發放的實現)
參數3:表示發送消息的時候帶的參數
Runtime 的作用
Objc 在三種層面上與 Runtime 系統進行交互:
Objective-C 源代碼
多數情況我們隻需要編寫 OC 代碼即可,Runtime 系統自動在幕後搞定一切,如果我們調用方法,編譯器會将 OC 代碼轉換成運行時代碼,在運行時确定數據結構和函數。
通過 Foundation 框架的 NSObject 類定義的方法
Cocoa 程序中絕大部分類都是 NSObject 類的子類,所以都繼承了 NSObject 的行為。(NSProxy 類時個例外,它是個抽象超類)
一些情況下,NSObject 類僅僅定義了完成某件事情的模闆,并沒有提供所需要的代碼。例如 -description 方法,該方法返回類内容的字符串表示,該方法主要用來調試程序。NSObject 類并不知道子類的内容,所以它隻是返回類的名字和對象的地址,NSObject 的子類可以重新實現。
還有一些 NSObject 的方法可以從 Runtime 系統中獲取信息,允許對象進行自我檢查。例如:
通過對 Runtime 庫函數的直接調用
Runtime 系統是具有公共接口的動态共享庫。頭文件存放于/usr/include/objc目錄下,這意味着我們使用時隻需要引入objc/Runtime.h頭文件即可。
許多函數可以讓你使用純 C 代碼來實現 Objc 中同樣的功能。除非是寫一些 Objc 與其他語言的橋接或是底層的 debug 工作,你在寫 Objc 代碼時一般不會用到這些 C 語言函數。對于公共接口都有哪些,後面會講到。我将會參考蘋果官方的 API 文檔。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!