Runtime詳解——iOS開發中的黑魔法

簡介

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 版本,這兩個版本之間都在努力保持一致。

點擊這裏下載蘋果維護的開源代碼。

Runtime 的作用

Objc 在三種層面上與 Runtime 系統進行交互:

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

Objective-C 源代碼

多數情況我們只需要編寫 OC 代碼即可,Runtime 系統自動在幕後搞定一切,還記得簡介中如果我們調用方法,編譯器會將 OC 代碼轉換成運行時代碼,在運行時確定數據結構和函數。

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

Cocoa 程序中絕大部分類都是 NSObject 類的子類,所以都繼承了 NSObject 的行爲。(NSProxy 類時個例外,它是個抽象超類)

一些情況下,NSObject 類僅僅定義了完成某件事情的模板,並沒有提供所需要的代碼。例如 -description 方法,該方法返回類內容的字符串表示,該方法主要用來調試程序。NSObject 類並不知道子類的內容,所以它只是返回類的名字和對象的地址,NSObject 的子類可以重新實現。

還有一些 NSObject 的方法可以從 Runtime 系統中獲取信息,允許對象進行自我檢查。例如:

  • -class方法返回對象的類;
  • -isKindOfClass: 和 -isMemberOfClass: 方法檢查對象是否存在於指定的類的繼承體系中(是否是其子類或者父類或者當前類的成員變量);
  • -respondsToSelector: 檢查對象能否響應指定的消息;
  • -conformsToProtocol:檢查對象是否實現了指定協議類的方法;
  • -methodForSelector: 返回指定方法實現的地址。

通過對 Runtime 庫函數的直接調用

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、Aspects 類結構分析
  • 2、Aspects 核心原理講解
  • 3、Aspects 流程分析

關於本次在線直播發布

一、直播時間

     2018年12月25日晚上20:00

二、主講人

     Kody老師

三、加入直播

     長按識別下方二維碼,通過小編驗證後即可獲得入羣參加線上直播以及課前資料。
iOS開發交流羣聊二維碼.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章