首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C objc_class 結構體深度解析

     編輯:關於C語言

Objective-C objc_class 運行時核心結構

Objective-C 中 NSObject 是大多數類別的根類,其定義僅包含一個 isa 指標:

@interface NSObject  {
    Class isa OBJC_ISA_AVAILABILITY;
}

Class 與 id 的本質

Apple 開源的 ObjC Runtime 代碼揭示:

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id;
  • Class 是 objc_class 結構指標
  • id 是 objc_object 結構指標
  • 任何類別定義本身也是對象,擁有 isa 指向其元類

objc_class 完整結構定義

struct objc_class {
    Class isa;                    // 指向元類
    Class super_class;            // 父類指標,根類為 NULL
    const char *name;             // 類別名稱
    long version;                 // 版本資訊,預設 0
    long info;                    // 運行期位標識
    long instance_size;           // 實例變數總大小
    struct objc_ivar_list *ivars; // 成員變數陣列
    struct objc_method_list **methodLists; // 方法定義陣列
    struct objc_cache *cache;     // 方法快取(優化調用)
    struct objc_protocol_list *protocols;  // 協議陣列
} OBJC2_UNAVAILABLE;

關鍵欄位深度解析

isa:類別對象的身份證

實例對象 isa 指向類別,類別對象 isa 指向元類。這構成了 Objective-C 獨特的「類別也是對象」體系。類別之間的 isa/super_class 關係圖可參考 官方類別圖譜。

objc_class 關係圖

super_class:繼承鏈追蹤

指向父類,根類(NSObject、NSProxy)為 NULL。配合 isa 實現方法查找:先找類別方法列表,再沿 super_class 向上搜尋。

name:類別名稱字串

Runtime 以字串查找類別(objc_getClass → look_up_class),內部構建 old_class 查詢結構,name 欄位存儲類別名稱作為雜湊鍵值。

version / info:版本與標識

  • version:類別版本,預設 0,可用於序列化版本控制
  • info:運行期位標識,標記類別特性(如是否為元類、是否實現特定協議等)

instance_size:實例記憶體佈局

包含所有實例變數(含繼承而來)的總大小,分配對象時依此劃分記憶體區塊。

ivars:成員變數列表

struct objc_ivar_list {
    int ivar_count;
    struct objc_ivar ivar_list[1];  // 可變長度結構
};

按宣告順序存儲,包含變數名、型別編碼、位移量等資訊。

methodLists:方法列表

struct objc_method_list {
    struct objc_method_list *obsolete;
    int method_count;
    struct objc_method method_list[1];
};

分類別方法與實例方法,支援分類動態添加方法。

cache:方法快取(效能關鍵)

struct objc_cache {
    unsigned int mask;      // 總容量 = mask + 1
    unsigned int occupied;  // 已用槽位
    Method buckets[1];      // 雜湊桶陣列
};

採用開放定址法雜湊表,鍵為選擇器(SEL),值為方法實現(IMP)。首次調用緩慢,後續命中快取極快,是 Objective-C 動態派發高效能的核心。

protocols:協議列表

struct objc_protocol_list {
    struct objc_protocol_list *next;
    long count;
    Protocol *list[1];
};

記錄類別遵循的所有協議,支援 conformsToProtocol: 執行期檢查。

總結

objc_class 是 Objective-C 物件模型的基石,封裝了類別的所有靜態資訊(名稱、繼承、變數、方法、協議)與動態優化機制(快取)。深入理解其結構,有助於掌握 KVO、動態方法解析、Method Swizzling 等進階技術原理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved