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
@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 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/44219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

46、lvs集群- 博客

1、lvs集群&#xff1a; lvs&#xff1a;linux virtual server----章文嵩发起的开源项目&#xff0c;阿里。linux的内核层面实现负载均衡的软件。 主要作用&#xff1a;将多个后端服务器组成一个高可用&#xff0c;高性能的服务器集群&#xff0c;通过负载均衡的算法将客户端的…

资讯类app怎么应对DDOS攻击

资讯类app怎么应对DDOS攻击&#xff1f;在数字化时代&#xff0c;资讯类App作为信息传播的重要载体&#xff0c;其稳定运行直接关系到用户的信任与满意度。日益猖獗的DDoS攻击成为了这类应用不可忽视的威胁。为了有效抵御这一挑战&#xff0c;业界涌现出了多种创新的防护方案&a…

基于cmake为项目自动获取git分支tag的版本号和commitid

目录 1. 引言2. 实现过程2.1 工程目录规划2.2 c程序文件2.3 CMakeLists.txt2.4 GitVersion.cmake文件2.5 BuildNumber.cmake文件1. 引言 在项目构建的时候,我们经常会希望能够将git提交的分支信息和提交号(commitid)以及当前版本发布的tag信息作为版本号自动构建到程序里面,以…

留学生的作业形式有哪些???

作业是在海外求学中不可避免的一部分&#xff0c;在国外留学&#xff0c;课程种类丰富多样&#xff0c;每一门课程都有其独特的学习要求和作业形式。课业压力很大&#xff0c;不仅要应对各项quiz&#xff0c;日常各类作业也丝毫不能松懈。无论是文学、艺术&#xff0c;还是理工…

【JavaScript脚本宇宙】实时协同编辑:JavaScript 库和框架全面解析

实时协同编辑&#xff1a;探秘JavaScript实时协同编辑利器## 前言 在当今互联网时代&#xff0c;实时协同编辑成为了许多应用程序的重要功能之一。无论是团队协作办公软件&#xff0c;还是在线教育平台&#xff0c;都需要实现多人同时编辑文档的功能。为了满足这一需求&#x…

自建搜索引擎-基于美丽云

Meilisearch 是一个搜索引擎&#xff0c;主程序完全开源&#xff0c;除了使用官方提供的美丽云服务&#xff08;收费&#xff09;进行对接之外&#xff0c;还可以通过自建搜索引擎来实现完全独立的搜索服务。 由于成本问题&#xff0c;本博客采用自建的方式&#xff0c;本文就…

通过git将文件push到github 远程仓库

1.先git clone 代码地址 git clone htttp://github.com/用户名/test.git 2. 添加文件 例如&#xff1a;touch 1.txt 3.将文件添加到暂存区 git add 1.txt 4.提交 git commit -m "commit 1.txt" 5.与远程仓库建立关联 git remote add 远程仓库名 远程仓库…

(2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)

前言 本系列最初的想法就是搭建一个多项目的环境, 包含nginx, nodejs, php, html, redis, MongoDB, mysql.本文使用的PHP镜像为php:7.3.6-apache, 这里可以使用上一篇文章中生成好的镜像.LAMP或包含react或vue的前端项目, 本文就各写了一个, 可以按照实际需求, 自行添加多个容…

LLM 研究方向(一): LLM Prompts--p-tuning、LoRA

目录 1. prompt-tuning background 2. Prompt Tuning 模型介绍 2.1 2021 prefix-tuning 2.2 2021 P-tuning v1 2.3 2021 Parameter-efficient prompt tuning (PET) 2.4 2022 P-tuning v2 2.5 2019 Adapter ​2.6 2021 LoRA (Low-Rank Adaptation) 2.7 2024 DoRA (…

详解[USACO07OPEN] Cheapest Palindrome G(洛谷PP2890)(区间DP经典题)

题目 思路 考虑区间DP。 设dp[i][j]为从i到j这段区间被修正为回文串的最小花费 c[cc][1]为添加字符cc的花费 c[cc][2]为删去字符cc的花费 s为题目给出的字符串。 用[i 1,j]区间转移&#xff1a;这种转移相当于在[i1,j]区间的左边加入一个字符&#xff0c;让[i,j]变为回文的方…

SQL 游标

关系数据库中的操作会对整个行集起作用。 例如&#xff0c;由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行。 这种由语句返回的完整行集称为结果集。 应用程序&#xff0c;特别是交互式联机应用程序&#xff0c;并不总能将整个结果集作为一个单元来有效地…

安装Go语言常用工具

好的&#xff0c;这里是常用的Go工具&#xff0c;包括下载地址、在线安装指令和离线安装步骤。 1. gopls (Go language server) 功能: 提供代码补全、跳转定义、文档提示等IDE功能。 下载地址: golang.org/x/tools/gopls 在线安装命令 : sh 复制代码 go install golang.org/…

云仓适合什么商家?

1、电商平台和网店&#xff1a; 对于拥有大量在线订单但没有自建仓储和物流能力的小型和中型电商企业&#xff0c;云仓可以在成本和效率上提供显著优势&#xff0c;帮助快速处理订单并缩短配送时间。 —————————————————————————————————— …

根据关键词query获取google_img(api方式)

文章目录 说明代码第一部分&#xff1a;链接保存为Json第二部分&#xff1a;链接转换为img 说明 根据关键词query获取google_img USERNAME “xxx” PASSWORD “xxx” 官网申请。 代码 首先获取图片链接&#xff0c;保存为json之后下载。 第一部分&#xff1a;链接保存为…

.net 8 使用 quic 协议通讯

debian环境安装 quic支持 # 1. 添加unstable仓库&#xff08;如果您使用的是Debian的不稳定分支&#xff09; sudo apt install apt-transport-https ca-certificates sudo wget -O /etc/apt/trusted.gpg.d/microsoft.gpg https://packages.microsoft.com/keys/microsoft.asc …

【独家揭秘】视频号矩阵系统火爆上线,一键式多平台管理,你的内容营销神器!

在信息爆炸的时代&#xff0c;内容创作者们面临着前所未有的挑战与机遇。如何让自己的内容在众多平台中脱颖而出&#xff0c;快速传播并吸引大量观众&#xff0c;成为了每个创作者关注的焦点。近日&#xff0c;一款名为“迅狐视频号矩阵系统”的神器震撼来袭&#xff0c;它以其…

UV胶,它是否有毒?如同那些隐藏在黑暗中的危险之物?

UV胶&#xff0c;它是否有毒&#xff1f;如同那些隐藏在黑暗中的危险之物&#xff1f; 关于uv胶的毒性问题&#xff0c;或许我们可以这样深入探讨。UV胶&#xff0c;如同一位戴着神秘面纱的访客&#xff0c;在我们的生活中悄然出现&#xff0c;却带着诸多疑问。那么&#xff0…

二维码生成需知:名片二维码尺寸多少合适?电子名片二维码制作方法?

随着数字化时代的到来&#xff0c;二维码在各个领域的应用越来越广泛&#xff0c;名片作为商业交流的重要工具之一&#xff0c;也开始逐渐融入二维码的元素。通过在名片上添加二维码&#xff0c;我们可以轻松实现信息的快速传递和分享。然而&#xff0c;名片二维码的尺寸选择成…

Monorepo仓库管理策略之 Lerna

这里写目录标题 前言&#xff1a;一、简介二、新建项目使用安装生成结构 三、复用现有项目执行命令查看包 四、配置package相互引用导入现有的包 五、发布包确定项目版本发布项目添加项目到到git发布包到NPM包发布出错解决方案 五、实例代码 前言&#xff1a; 将大型代码仓库分…

Python 与扣子 API的链接

当 Python 与各种 API 进行链接时&#xff0c;更是能碰撞出无数精彩的火花&#xff0c;为我们的开发工作带来极大的便利和创新。今天&#xff0c;咱们就来聊聊 Python 与扣子 API 的链接那些事儿。 扣子 API 作为一种新兴的技术接口&#xff0c;为我们提供了丰富的数据和功能。…