在計算機領域中,程式碼從編寫到執行得出結果,中間會有編譯、鏈接、執行等過程,這樣我們的程式碼纔可以轉換成計算機所識別的指令等,然後達成我們期望的效果。而runtime
就是處於執行的這個階段。基本上每個平臺都有自己的runtime,比如Android
等。
參照網上看到的一個說法,不知道是否準確,可以做個參考
「runtime 是一個通用的抽象的術語,指的是計算機程式執行的時候所需要的一切程式碼庫,框架,平臺等。」
Apple 中對runtime的描述
將盡可能多的決策從編譯時和鏈接時推遲到執行時(Apple)
執行時系統充當着Object-C語言的操作系統,它使語言能夠工作(Apple)
…
參考程式碼:
呼叫 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