在 Objective-C 運行時系統中,NSObject
是所有類的根類。為了理解 NSObject
的元類(MetaClass)以及它的 super_class
指針指向誰,我們需要理解元類的繼承關系。
類和元類的關系
- 每個類對象都有一個
isa
指針,指向其元類對象。 - 元類對象也有一個
isa
指針,指向根元類對象。 - 根元類對象的
isa
指針指向自己。 - 每個類對象的
super_class
指針指向其父類。 - 元類對象的
super_class
指針指向其父類的元類對象。
NSObject
和其元類的關系
NSObject
的類對象的super_class
指針為nil
,因為它是根類。NSObject
的元類對象的super_class
指針指向NSObject
的類對象。
具體的關系圖
+-------------------+ +-------------------------+ +-------------------------+
| 實例對象 | --> | 類對象 | --> | 元類對象 |
+-------------------+ +-------------------------+ +-------------------------+
| isa -> MyClass | | isa -> MyClass's MetaClass | | isa -> RootMetaClass |
+-------------------+ +-------------------------+ +-------------------------+
| | | super_class -> NSObject | | super_class -> NSObject|
+-------------------+ +-------------------------+ +-------------------------+
代碼示例
為了更好地理解,讓我們通過代碼示例來驗證這些關系:
#import <objc/runtime.h>
#import <Foundation/Foundation.h>@interface MyClass : NSObject
@end@implementation MyClass
@endint main(int argc, const char * argv[]) {@autoreleasepool {MyClass *obj = [[MyClass alloc] init];Class objClass = object_getClass(obj); // MyClassClass objMetaClass = object_getClass(objClass); // MyClass's MetaClassClass rootClass = [NSObject class]; // NSObjectClass rootMetaClass = object_getClass(rootClass); // NSObject's MetaClassNSLog(@"Instance: %p", obj);NSLog(@"Class: %p", objClass);NSLog(@"MetaClass: %p", objMetaClass);NSLog(@"RootClass: %p", rootClass);NSLog(@"RootMetaClass: %p", rootMetaClass);NSLog(@"Instance isa: %p", *(uintptr_t *)obj);NSLog(@"Class isa: %p", *(uintptr_t *)objClass);NSLog(@"MetaClass isa: %p", *(uintptr_t *)objMetaClass);NSLog(@"RootClass isa: %p", *(uintptr_t *)rootClass);NSLog(@"RootMetaClass isa: %p", *(uintptr_t *)rootMetaClass);NSLog(@"NSObject's MetaClass super_class: %p", *(uintptr_t *)((uintptr_t *)rootMetaClass + 1));}return 0;
}
結果分析
運行上面的代碼,你會得到以下結果(內存地址可能不同):
Instance: 0x600003b7a0c0
Class: 0x10f512340
MetaClass: 0x10f512370
RootClass: 0x10f5112a0
RootMetaClass: 0x10f5112d0Instance isa: 0x10f512340
Class isa: 0x10f512370
MetaClass isa: 0x10f5112d0
RootClass isa: 0x10f5112d0
RootMetaClass isa: 0x10f5112d0NSObject's MetaClass super_class: 0x10f5112a0
解釋
Instance isa
指向MyClass
類對象。Class isa
指向MyClass
的元類對象。MetaClass isa
指向NSObject
的元類對象。RootClass isa
和RootMetaClass isa
都指向NSObject
的元類對象,因為NSObject
是根類。NSObject
的元類對象的super_class
指針指向NSObject
的類對象。
總結
NSObject
的元類對象的isa
指針指向自己,表示這是元類的終點。NSObject
的元類對象的super_class
指針指向NSObject
的類對象。
理解這些關系有助于掌握 Objective-C 的運行時系統以及類和元類之間的復雜關系。這些關系確保了 Objective-C 的動態特性和靈活的面向對象編程模型。
拓展
BOOL first = [[NSObject class] isKindOfClass:[NSObject class]]; // YES
BOOL second = [[NSObject class] isMemberOfClass:[NSObject class]]; // NO
BOOL third = [[Fisher class] isKindOfClass:[Fisher class]]; // NO
BOOL fourth = [[Fisher class] isMemberOfClass:[Fisher class]]; // NO