![cover](https://i-blog.csdnimg.cn/direct/e8814c98188c4c1189c9cd065586d6ec.png)
NSObject‘s MetaClass 的 super_class 指向谁 ?
在 Objective-C 运行时系统中,`NSObject` 是所有类的根类。为了理解 `NSObject` 的元类(MetaClass)以及它的 `super_class` 指针指向谁,我们需要理解元类的继承关系。
·
在 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
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
MyClass *obj = [[MyClass alloc] init];
Class objClass = object_getClass(obj); // MyClass
Class objMetaClass = object_getClass(objClass); // MyClass's MetaClass
Class rootClass = [NSObject class]; // NSObject
Class rootMetaClass = object_getClass(rootClass); // NSObject's MetaClass
NSLog(@"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: 0x10f5112d0
Instance isa: 0x10f512340
Class isa: 0x10f512370
MetaClass isa: 0x10f5112d0
RootClass isa: 0x10f5112d0
RootMetaClass isa: 0x10f5112d0
NSObject'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
更多推荐
所有评论(0)