在 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