Objective-C 中 NSObject 是大多數類別的根類,其定義僅包含一個 isa 指標:
@interface NSObject {
Class isa OBJC_ISA_AVAILABILITY;
}
Apple 開源的 ObjC Runtime 代碼揭示:
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
Class 是 objc_class 結構指標id 是 objc_object 結構指標isa 指向其元類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 指向元類。這構成了 Objective-C 獨特的「類別也是對象」體系。類別之間的 isa/super_class 關係圖可參考 官方類別圖譜。

指向父類,根類(NSObject、NSProxy)為 NULL。配合 isa 實現方法查找:先找類別方法列表,再沿 super_class 向上搜尋。
Runtime 以字串查找類別(objc_getClass → look_up_class),內部構建 old_class 查詢結構,name 欄位存儲類別名稱作為雜湊鍵值。
version:類別版本,預設 0,可用於序列化版本控制info:運行期位標識,標記類別特性(如是否為元類、是否實現特定協議等)包含所有實例變數(含繼承而來)的總大小,分配對象時依此劃分記憶體區塊。
struct objc_ivar_list {
int ivar_count;
struct objc_ivar ivar_list[1]; // 可變長度結構
};
按宣告順序存儲,包含變數名、型別編碼、位移量等資訊。
struct objc_method_list {
struct objc_method_list *obsolete;
int method_count;
struct objc_method method_list[1];
};
分類別方法與實例方法,支援分類動態添加方法。
struct objc_cache {
unsigned int mask; // 總容量 = mask + 1
unsigned int occupied; // 已用槽位
Method buckets[1]; // 雜湊桶陣列
};
採用開放定址法雜湊表,鍵為選擇器(SEL),值為方法實現(IMP)。首次調用緩慢,後續命中快取極快,是 Objective-C 動態派發高效能的核心。
struct objc_protocol_list {
struct objc_protocol_list *next;
long count;
Protocol *list[1];
};
記錄類別遵循的所有協議,支援 conformsToProtocol: 執行期檢查。
objc_class 是 Objective-C 物件模型的基石,封裝了類別的所有靜態資訊(名稱、繼承、變數、方法、協議)與動態優化機制(快取)。深入理解其結構,有助於掌握 KVO、動態方法解析、Method Swizzling 等進階技術原理。