標籤:objective-c runtime
內容列表
- 物件模型(結構定義,類對象、元類和執行個體對象的關係)
- 訊息傳遞和轉寄機制
- runtime系統功能理解
物件模型結構定義
對象(Object): OC中基本構造單元 (building block),用於儲存和傳遞資料。
可以在objc.h的檔案中尋找到對象結構的定義,如下所示即對象結構為Class類型的isa,而Class是 objc_class結構類型指標。objc_class即我們理解的類對象結構,其也包含一個isa類對象結構指標。
類和對象的最終實現都是一種資料結構,(subclass is an instance of superclass)
/// Represents an instance of a class.struct objc_object { Class isa OBJC_ISA_AVAILABILITY;};
/// A pointer to an instance of a class.typedef struct objc_object *id;
/// An opaque type that represents an Objective-C class.typedef struct objc_class *Class;
struct objc_class { Class isa OBJC_ISA_AVAILABILITY;#if !__OBJC2__ Class super_class OBJC2_UNAVAILABLE; const char *name OBJC2_UNAVAILABLE; long version OBJC2_UNAVAILABLE; long info OBJC2_UNAVAILABLE; long instance_size OBJC2_UNAVAILABLE; struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; struct objc_method_list **methodLists OBJC2_UNAVAILABLE; struct objc_cache *cache OBJC2_UNAVAILABLE; struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;#endif} OBJC2_UNAVAILABLE;
類(類對象)、元類(元類對象)和執行個體對象的關係
一個完整的類應該包括類方法、執行個體方法和成員變數(執行個體變數), 每個對象都包括一個isa(is a class)指標指向類對象(運行時方法發送給對象訊息,才確定類別並調用相應的方法實現
),類對象結構中記載了類的所有資訊。
類對象的isa指向元類對象(meta class),類對象中的方法列表是執行個體方法(-, instance methods), 元類對象中的方法列表是類方法(+, class methods)
- 可以這麼理解:
類包括類對象和元類對象,它們通過類對象結構定義,構成類的所有資訊。在定義執行個體對象的時候,並不會進行任何儲存空間(堆)分配,直到調用類方法alloc函數和執行個體方法init函數實現執行個體對象在堆中的結構儲存分配,並將isa指向其類對象,父類成員變數和對應類對象成員變數初始化為0或nil
上述理解可以通過下面代碼和物件變數結構分析來進行確認。
#import <Foundation/Foundation.h>#import <objc/runtime.h>@interface AClass : NSObject{ int a; char cA;}- (void)printA;@end@implementation AClass- (void)printA{ NSLog(@"I am class A~");}@end@interface BClass : AClass{ int b; char cB;}- (void)printB;@end@implementation BClass- (void)printB{ NSLog(@"I am class B~");}@end// ---------- main ----------int main(int argc, const char * argv[]) { @autoreleasepool { // ******物件模型初探****** AClass *a = [[AClass alloc] init]; BClass *b = [[BClass alloc] init]; BClass *b1; [a printA]; [b printB]; } return 0; }
- 查看物件變數結構(通過設定斷點進入Debug模式查看)
- 類對象、元類和執行個體對象的isa指標調用圖示(subclass is a instance of superclass)
(1) Root class 是NSObject, NSObject沒有超類,superclass -> nil
(2) 每個類對象都有一個isa指向唯一的Meta class
(3) 每個元類對象的 isa指標都指向 NSObject的元類對象
訊息傳遞和轉寄機制
訊息傳遞(Messaging): 在對象之間傳遞資料並執行任務的過程
Objective-C基於C語言加入了物件導向特性和訊息轉寄機制的動態語言,除編譯器外還需要用Runtime系統來動態建立類和對象進行訊息發送和轉寄。
不同語言有不同函數傳遞方法,C語言 - 函數指標,C++ - 函數調用(引用)類成員函數在編譯時間候就確定了其所屬類別, Objective-C 通過選取器和block。
Objective-C強調訊息傳遞而非方法調用。可以向一個對象傳遞訊息,且不需要再編譯期聲明這些訊息的處理方法。這些方法在運行時才確定。運行時(runtime)具體功能將在下面介紹。
[receiver message];
並不會馬上執行 receiver 對象的 message方法的代碼,而是向receiver發送一條message訊息,該句話被編譯器轉化為:
id obj_msgSend(id self, SEL op, …);
PS: 訊息調用函數還存在特殊情況,如其他函數
objc_msgSend_stret //待發送訊息返回結構體
objc_msgSend_fpret //返回浮點數
objc_msgSendSuper //給超類發訊息
SEL 表示方法選取器,結構如下: typedef struct objc_selector*SEL;
, 可通過關鍵字@selector()獲得
id 資料結構在第一部分:物件模型
中已經有定義。
obj_msgSend 發訊息流程程:
- 根據receiver 對象的isa類對象指標擷取對應的class(類對象);
- 優先在類對象的cache(fast map)尋找message方法,Not find ->再到methodLists(類中的調度表,用於映射方法和實際記憶體位址,同時類中還包括指向父類的指標)尋找;
- 如果沒有在class象裡找到,再到super_class尋找;
- 如果找到message這個方法,執行它的實現IMP
- 如果找不到訊息,則執行訊息轉寄(message forwarding)
Method資料結構
runtime.h標頭檔中定義:
typedef struct objc_method *Method;struct objc_method { SEL method_name; // 特殊的字串,描述方法名, 可以通過關鍵字 @selector( ) 擷取 char *method_types; IMP method_imp;}
PS:訊息轉寄分為兩大階段即動態添加方法解析(dynamic method resolution)和完整的訊息轉寄機制(full forward mechanism)
runtime系統功能理解
runtime : 程式運行後,提供相關支援的代碼叫做OC運行期環境(OC runtime)
,它提供了對象間傳遞訊息的重要函數(比如objc_msgSend),並且包含建立類執行個體所用的全部邏輯(即建立執行個體對象的儲存結構和空間,包括isa指向“類對象”的指標)
runtime系統是一個用C語言編寫動態連結程式庫,核心是訊息分發。Runtime機制包括物件模型,訊息傳遞和轉寄,方法實現機制和其他運行時方法,可以實現動態建立修改類對象和對象等功能,訊息傳遞和轉寄,方法動態實現,Method Swizzling等功能。
參考資源
Effective Objective-C 2.0
Objective-C的物件模型與運行時
深入理解Objective-C的Runtime機制
Objective-C的動態特性
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Objective-C的物件模型和runtime機制