Runtime 又叫運行時,是一套底層的 C 語言 API,其爲 iOS 內部的核心之一,咱們平時編寫的 OC 代碼,底層都是基於它來實現的。好比:編程
[receiver message]; // 底層運行時會被編譯器轉化爲: objc_msgSend(receiver, selector) // 若是其還有參數好比: [receiver message:(id)arg...]; // 底層運行時會被編譯器轉化爲: objc_msgSend(receiver, selector, arg1, arg2, ...)
以上你可能看不出它的價值,可是咱們須要瞭解的是 Objective-C 是一門動態語言,它會將一些工做放在代碼運行時才處理而並不是編譯時。也就是說,有不少類和成員變量在咱們編譯的時是不知道的,而在運行時,咱們所編寫的代碼會轉換成完整的肯定的代碼運行。安全
所以,編譯器是不夠的,咱們還須要一個運行時系統(Runtime system)來處理編譯後的代碼。數據結構
Runtime 基本是用 C 和彙編寫的,因而可知蘋果爲了動態系統的高效而作出的努力。蘋果和 GNU 各自維護一個開源的 Runtime 版本,這兩個版本之間都在努力保持一致。app
點擊這裏下載蘋果維護的開源代碼。框架
Objc 在三種層面上與 Runtime 系統進行交互:函數
多數狀況咱們只須要編寫 OC 代碼便可,Runtime 系統自動在幕後搞定一切,還記得簡介中若是咱們調用方法,編譯器會將 OC 代碼轉換成運行時代碼,在運行時肯定數據結構和函數。學習
Cocoa 程序中絕大部分類都是 NSObject 類的子類,因此都繼承了 NSObject 的行爲。(NSProxy 類時個例外,它是個抽象超類)spa
一些狀況下,NSObject 類僅僅定義了完成某件事情的模板,並無提供所須要的代碼。例如 -description
方法,該方法返回類內容的字符串表示,該方法主要用來調試程序。NSObject 類並不知道子類的內容,因此它只是返回類的名字和對象的地址,NSObject 的子類能夠從新實現。debug
還有一些 NSObject 的方法能夠從 Runtime 系統中獲取信息,容許對象進行自我檢查。例如:設計
-class
方法返回對象的類;-isKindOfClass:
和 -isMemberOfClass:
方法檢查對象是否存在於指定的類的繼承體系中(是不是其子類或者父類或者當前類的成員變量);-respondsToSelector:
檢查對象可否響應指定的消息;-conformsToProtocol:
檢查對象是否實現了指定協議類的方法;-methodForSelector:
返回指定方法實現的地址。Runtime 系統是具備公共接口的動態共享庫。頭文件存放於/usr/include/objc目錄下,這意味着咱們使用時只須要引入objc/Runtime.h
頭文件便可。
許多函數可讓你使用純 C 代碼來實現 Objc 中一樣的功能。除非是寫一些 Objc 與其餘語言的橋接或是底層的 debug 工做,你在寫 Objc 代碼時通常不會用到這些 C 語言函數。
Runtime深刻講解——Aspects 源碼解析
AOP 即面向切面編程,初次接觸 AOP 的人可能會困惑,到底什麼是 AOP。舉個簡單的列子,通常隨着業務和產品的發展,產品須要在頁面中加入本身的頁面統計。這個時候咱們會怎麼作?面向對象的思想是這些統計功能不少頁面都會用到,每一個 VC 寫一次特別麻煩,因而全部的 VC 都繼承自一個基類。並且隨着項目的增大,通常咱們會把一些經常使用的功能寫成組件的形式來使用,這時就抽取出來的功能可能就要依賴這個基類,抽取的時候就比較難受。因此這個時候 AOP 就能夠完美的解決這個問題,對於 OC 來講,咱們能夠直接 Method-Swizzling 來 Hook 當前的 viewWillAppear 和 viewWillDisappear 而後統計信息。可是這種簡單的 Method-Swizzling 其實存在必定的安全隱患。
Aspects 是一個使用簡單的 AOP 庫,適用於 iOS 和 OS X
在本節課當中咱們能夠學習到做者是如何設計這個庫,以及在 Hook 過程當中處理了不少可能發生的隱患問題。一樣這裏面涉及到不少 Runtime 的知識,絕對是學習進階的好資料。
知識點:
關於本次在線直播發布
1、直播時間
2018年12月25日晚上20:00
2、主講人
Kody老師
3、加入直播
長按識別下方二維碼,經過小編驗證後便可得到入羣參加線上直播以及課前資料。