iOS runtime的通俗理解

2020-08-12 10:35:44

runtime 在程式開發中的定位:

在計算機領域中,程式碼從編寫到執行得出結果,中間會有編譯鏈接執行等過程,這樣我們的程式碼纔可以轉換成計算機所識別的指令等,然後達成我們期望的效果。而runtime 就是處於執行的這個階段。基本上每個平臺都有自己的runtime,比如Android等。

參照網上看到的一個說法,不知道是否準確,可以做個參考

「runtime 是一個通用的抽象的術語,指的是計算機程式執行的時候所需要的一切程式碼庫,框架,平臺等。」

Apple 中對runtime的描述

將盡可能多的決策從編譯時和鏈接時推遲到執行時(Apple)
執行時系統充當着Object-C語言的操作系統,它使語言能夠工作(Apple)

Objective-C 中runtime所起的作用
1、Objective-C程式在三個不同的層次上與執行時系統互動:
  • 通過Object-C原始碼進行互動
  • 通過NSObject類中定義的方法互動
  • 通過直接呼叫執行時函數
2、runtime 在開發中有什麼作用
  • 在程式執行過程中,動態地新增類,修改類的屬性和方法
  • 遍歷類中的所有屬性和方法
  • 訊息機制 機製:訊息傳遞、轉發
3、runtime 的典型使用案例
  • 給分類新增屬性和方法實現
  • 字典轉模型
  • KVC、KVO
  • 歸檔(編碼、解碼)
  • 方法交換
  • 根據類名建立類,根據方法名找到方法實現

參考程式碼:

呼叫 runtime 的c語言程式碼需要新增的標頭檔案

#import <objc/runtime.h>
#import <objc/message.h>

objc_class 結構體定義:

struct objc_class {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class _Nullable super_class                              OBJC2_UNAVAILABLE;
    const char * _Nonnull name                               OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

訊息轉發過程會呼叫的方法:
1、動態方法解析

+ (BOOL)resolveInstanceMethod:(SEL)sel 實體方法解析
+ (BOOL)resolveClassMethod:(SEL)sel 類方法解析

2、後備接受者物件

- (id)forwardingTargetForSelector:(SEL)aSelector

3、以其他形式實現該訊息方法

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
- (void)forwardInvocation:(NSInvocation *)anInvocation

4、最後未處理,拋出異常

- (void)doesNotRecognizeSelector:(SEL)aSelector

參考網站:深入淺出Runtime