Objective-C的物件模型和runtime機制

來源:互聯網
上載者:User

標籤: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;};
  • id類型定義
/// A pointer to an instance of a class.typedef struct objc_object *id;
  • Class類型定義
/// 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機制

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.