NSObject‘s 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 isaRootMetaClass 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

相关推荐

  1. ps教程

    2024-07-10 16:32:02       20 阅读
  2. 自动驾驶,革了

    2024-07-10 16:32:02       7 阅读
  3. 指向函数指针

    2024-07-10 16:32:02       11 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 16:32:02       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 16:32:02       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 16:32:02       4 阅读
  4. Python语言-面向对象

    2024-07-10 16:32:02       5 阅读

热门阅读

  1. 构建基于Spring Boot的数据分析平台

    2024-07-10 16:32:02       11 阅读
  2. 每天一个数据分析题(四百零十)- 主成分

    2024-07-10 16:32:02       8 阅读
  3. 卷积神经网络:目标检测的黄金钥匙

    2024-07-10 16:32:02       12 阅读
  4. Pandas 基础 —— 探索数据分析的第一步

    2024-07-10 16:32:02       11 阅读
  5. MyBatisPlus

    2024-07-10 16:32:02       7 阅读
  6. Android 通用视频组件开发

    2024-07-10 16:32:02       12 阅读
  7. 目标检测算法详细介绍!

    2024-07-10 16:32:02       8 阅读
  8. 中医四大经典之 No.1

    2024-07-10 16:32:02       10 阅读
  9. 支持向量机(Support Vector Machine,SVM)

    2024-07-10 16:32:02       9 阅读
  10. vue2 、 vue3首屏优化,减少白屏时间

    2024-07-10 16:32:02       9 阅读
  11. 对于配置LLM,集显和独显的具体区别和影响

    2024-07-10 16:32:02       10 阅读
  12. Perl 语言入门学习

    2024-07-10 16:32:02       8 阅读
  13. 单例模式之静态内部类与枚举类

    2024-07-10 16:32:02       9 阅读
  14. 爬虫技术抓取网站数据

    2024-07-10 16:32:02       11 阅读
  15. [Go] 字符串遍历数据类型问题

    2024-07-10 16:32:02       9 阅读