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.pswp.cn/diannao/44219.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44219.shtml
英文地址,請注明出處:http://en.pswp.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;為我們提供了豐富的數據和功能。…