Objective-C 中的 isa 不再是簡單的結構體指針

了解 Objective-C 中的 isa 指針內存結構

在 Objective-C 中,isa 指針是對象和類之間的重要橋梁。它不僅幫助運行時系統識別對象的類型,還參與了一些內存和性能優化。本文將深入講解 isa 指針的內存結構,包括其在早期和現代實現中的演變。

什么是 isa 指針?

每個 Objective-C 對象都有一個 isa 指針,它指向對象的類對象。類對象本身也是一個對象,它的 isa 指針指向一個元類對象(meta-class)。元類對象存儲類方法,并且其 isa 指針最終指向根元類(通常是 NSObject 的元類)。

早期的 isa 指針結構

在早期的 Objective-C 實現中,isa 指針簡單地指向類對象的結構體。以下是一個典型的早期實現示例:

struct objc_object {Class isa; // 指向類對象的指針
};typedef struct objc_class *Class; // Class 的本質是 objc_class 類型的結構體指針
struct objc_class {Class isa; // 指向元類對象的指針Class super_class; // 指向父類對象的指針// 其他類相關的元數據
};

在這種結構下:

  • 對象的 isa 指針指向類對象。
  • 類對象的 isa 指針指向元類對象。
  • 元類對象的 isa 指針指向根元類對象。

現代 isa 指針結構

在 64 位系統和現代 Objective-C 運行時中,isa 指針被重新設計為一個更復雜的聯合體(union isa_t),它不僅包含指向類對象的指針,還包含其他標志位和信息,以優化內存使用和性能。以下是 isa_t 結構的一個簡化示例:

union isa_t {isa_t() { }isa_t(uintptr_t value) : bits(value) { }Class cls; // 指向類對象的指針uintptr_t bits; // 包含位域信息的位模式struct {uintptr_t nonpointer        : 1;  // 是否啟用優化的 non-pointer isauintptr_t has_assoc         : 1;  // 是否有關聯對象uintptr_t has_cxx_dtor      : 1;  // 是否有 C++ 析構函數uintptr_t shiftcls          : 33; // 類指針(經過位移和壓縮)uintptr_t magic             : 6;  // 調試用的魔數uintptr_t weakly_referenced : 1;  // 是否被弱引用uintptr_t deallocating      : 1;  // 是否正在釋放uintptr_t has_sidetable_rc  : 1;  // 是否有輔助引用計數表uintptr_t extra_rc          : 19; // 額外的引用計數};
};

結構字段解釋

  • nonpointer:指示 isa 是否為非指針類型(優化內存布局,存儲額外信息)。
  • has_assoc:對象是否有關聯引用(Associative References)。
  • has_cxx_dtor:對象是否有 C++ 析構函數,需要調用析構函數。
  • shiftcls:類指針,存儲對象的類信息(經過位移和壓縮)。
  • magic:用于調試和運行時驗證的魔數(magic number)。
  • weakly_referenced:對象是否被弱引用指向。
  • deallocating:對象是否正在被釋放。
  • has_sidetable_rc:對象的引用計數是否存儲在輔助表(Side Table)中。
  • extra_rc:額外的引用計數,用于優化內存占用。

引用計數的存儲與管理

在早期的 Objective-C 實現中,引用計數通常作為對象結構的一部分直接存儲在對象中。例如:

struct objc_object {Class isa; // 指向類對象的指針uintptr_t retainCount; // 引用計數
};

在現代的 Objective-C 運行時中,引用計數通過 isa 指針的優化結構和 Side Table 輔助數據結構進行管理。

  • Inline Reference Counting:部分引用計數信息被存儲在 isa 指針的優化結構中,例如 extra_rc 字段。
  • Side Table:當引用計數超出 isa 指針所能表示的范圍時,引用計數會存儲在一個稱為 Side Table 的輔助數據結構中。

Modern isa 指針的優勢

  • 內存優化:通過將更多信息(如引用計數、標志位)存儲在 isa 指針中,減少了對其他內存區域的訪問,提升了性能。
  • 性能提升:減少了內存讀取操作,因為可以在一次內存讀取中獲取更多信息。
  • 更豐富的元數據:可以包含更多運行時信息,有助于提高運行時的靈活性和效率。

使用示例

雖然開發者在日常編碼中通常不直接與 isa 指針交互,但理解其結構對于調試和優化性能是有幫助的。以下是一個使用示例,通過訪問對象的類信息來顯示對象的類型:

#import <Foundation/Foundation.h>
#import <objc/runtime.h>@interface MyClass : NSObject
@end@implementation MyClass
@endint main(int argc, const char * argv[]) {@autoreleasepool {MyClass *obj = [[MyClass alloc] init];Class cls = object_getClass(obj);NSLog(@"Class name: %s", class_getName(cls));// 訪問 isa 指針信息(需要通過運行時函數)NSLog(@"isa pointer: %p", *(uintptr_t *)obj);}return 0;
}

總結

isa 指針在 Objective-C 運行時中扮演著重要角色,從早期簡單的指向類對象,到現代復雜的 isa_t 結構,它幫助優化了內存使用和性能。理解 isa 指針的演變和內存結構,可以幫助我們更好地掌握 Objective-C 的運行時機制,并編寫高效的代碼。

希望這篇文章能幫助你深入了解 Objective-C 中 isa 指針的內存結構。如有任何問題或建議,歡迎留言討論。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43541.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43541.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43541.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux使用python調用串口<Ubuntu>

要在 Ubuntu 上使用 /dev/ttyUSB0 設備編寫一個簡單的串口收發程序&#xff0c;你可以使用 Python&#xff0c;結合 pyserial 庫來實現。這種方法相對簡單&#xff0c;適用于各種串行通信任務。以下是如何在 Python 中編寫串口收發程序的步驟及代碼示例&#xff1a; 步驟 1: 安…

JWT重放漏洞攻防策略

JWT重放漏洞概述 概念&#xff1a;JWT&#xff08;JSON Web Token&#xff09;是Web應用廣泛使用的身份驗證令牌。重放攻擊&#xff1a;攻擊者截獲JWT后&#xff0c;利用其有效性冒充用戶執行操作。 重放攻擊的危害 權限濫用&#xff1a;攻擊者可越權操作&#xff0c;如非法…

ffmpeg新舊函數對比

搬運博客園“kn-zheng”大佬博客 從FFmpeg 3.0 開始 &#xff0c; 使用了很多新接口&#xff0c;對不如下&#xff1a; 1、avcodec_decode_video2() 原本的解碼函數被拆解為兩個函數avcodec_send_packet()和avcodec_receive_frame() 具體用法如下&#xff1a; old: avcodec_d…

MySQL8之mysql-community-embedded-compat的作用

MySQL8中的mysql-community-embedded-compat包的作用主要是提供MySQL服務器作為嵌入式庫時的兼容性支持&#xff0c;特別是對于那些使用庫版本18的應用程序。嵌入式MySQL服務器允許開發者將MySQL數據庫直接嵌入到他們的應用程序中&#xff0c;而無需運行獨立的MySQL服務器進程。…

Transformer 論文通俗解讀:FFN 的作用

在經過前面3節關于 Transformer 論文的解讀之后&#xff0c;相信你對提出 Transformer 架構的這篇論文有了一定的了解了&#xff0c;你可以點擊下面的鏈接復習一下前3節的內容。 《Attention is all you need》通俗解讀&#xff0c;徹底理解版&#xff1a;part1 《Attention …

合合信息“大模型加速器”亮相2024世界人工智能大會

文章目錄 &#x1f4d1;引言一、大模型發展的挑戰數據稀缺問題 二、大模型“加速器”解決方案概述文檔解析引擎的特征 三、文檔解析引擎的優勢3.1 高速處理能力3.2 智能理解文檔結構3.3 多種數據類型支持3.4 高精度數據提取3.5 應用廣泛&#xff0c;適應性強 四、復雜圖表解析4…

Auslogics Disk Defrag Pro v11激活版下載、安裝、使用教程 (磁盤碎片整理工具)

前言 Auslogics Disk Defrag Pro 是一款支持 FAT16 文件系統的磁盤碎片整理工具&#xff0c;它可以快速整理磁盤碎片&#xff0c;使磁盤空間更加整潔&#xff0c;顯著提升電腦的運行速度。該軟件無需任何分析階段&#xff0c;并且速度比大多數其他碎片整理軟件更快。它可以幫助…

stm32 開發板可以拿來做什么?

STM32開發板可以用來做許多不同的事情&#xff0c;具體取決于您的應用需求和編程能力。我收集歸類了一份嵌入式學習包&#xff0c;對于新手而言簡直不要太棒&#xff0c;里面包括了新手各個時期的學習方向編程教學、問題視頻講解、畢設800套和語言類教學&#xff0c;敲個22就可…

詳解太陽能控制器PWM / MPPT極簡方案其設計要點,臺灣遠翔FP7209升壓24V,30V,36V,42V,48V

文章目錄 前言 一、單節電池升壓9V、12V、24V方案 二、單節電池升壓30V&#xff0c;36V&#xff0c;42V&#xff0c;48V方案 三、芯片介紹 FP7209X與FP7209M的區別&#xff1a; 四、單節電池升壓成為市面上太陽能控制器首選的原因&#xff1f; 總結 前言 太陽能是一種環保…

定時器TIM配置微妙延時函數

定時器TIM配置微妙延時函數 文章目錄 定時器TIM配置微妙延時函數開胃小菜&#xff08;BOOT0、BOOT1&#xff09;Boot0Boot1&#xff08;如果有&#xff09; 三種定時器高級控制定時器&#xff08;TIM1&#xff0c;TIM8&#xff09;通用定時器&#xff08;TIM2, TIM3, TIM4, TIM…

linux命令: rsync的使用

使用rsync同步本地文件夾到遠程目錄 rsync -zvrt /localdir/ -e ssh -p 30000 rootip:/remotedir/rsync -zvrt /localdir/ /remotedir/ 遠程備份 rsync -avlR --delete -e ssh -p 3231 tangboqi221.122.114.27:backup ~/backup/ R表示保留目錄結構&#xff0c;如果不保留…

基于Intel Chainer 和姿勢檢測的動作識別(人體、面部、手部關鍵點識別動作識別)

項目概述 目標 開發一個能夠實時或近實時識別特定動作的系統&#xff0c;如運動姿勢、表情變化或手勢控制。實現對人體關鍵點的精確追蹤&#xff0c;以便于分析和理解人的動態行為。 技術棧 Intel硬件&#xff1a;可能使用Intel的高性能計算平臺&#xff0c;如Xeon處理器或…

【國潮】國產化系統甲方問題總結

持續更新。。。。。。。。。。。。。。。 【國潮】國產化系統甲方問題總結 1. 安全性問題2. 可靠性和穩定性問題3. 性能問題4. 符合軍事標準問題5. 兼容性和集成問題6. 維護和升級問題7. 項目管理問題8. 隱私和合規性問題9. 災難恢復和備份問題10. 技術支持和培訓問題 引言&am…

zookeeper的shell操作

一&#xff1a;啟動拽庫的shell命令行 zkCli.sh -server localhost:2181 退出&#xff1a;quit 二&#xff1a;查詢所有的命令 help 三&#xff1a;查詢對應的節點 --查詢zk上的根節點 ls / ls /zookeeper 四&#xff1a;查詢對應節點的節點信息&#xff08;節點的元數據&a…

[AI 大模型] 阿里巴巴 通義千問

文章目錄 [AI 大模型] 阿里巴巴 通義千問簡介模型架構發展新技術和優勢示例 [AI 大模型] 阿里巴巴 通義千問 簡介 阿里巴巴的 通義千問 是由阿里云開發的一款大型語言模型&#xff0c;旨在為用戶提供高效、智能的自然語言處理服務。 通義千問能夠處理多種語言輸入&#xff0c…

c# Bitmap

在C#中&#xff0c;Bitmap 類是一個表示位圖圖像的類&#xff0c;它屬于 System.Drawing 命名空間。Bitmap 類是從 Image 類派生的&#xff0c;因此它繼承了 Image 類的所有屬性和方法&#xff0c;并添加了一些專門用于處理位圖的功能。 以下是關于 Bitmap 類的一些基本信息和…

Supervisord控制進程舉例

當使用Supervisord來控制進程時&#xff0c;通常會配置一個或多個進程組&#xff08;program group&#xff09;&#xff0c;每個進程組負責監控和管理一個特定的進程或應用程序。以下是一個具體的例子&#xff1a; 假設我們有一個簡單的 Flask 應用程序&#xff0c;我們希望使…

免殺筆記 ---> Session0--DLL注入

剛更新完上一篇&#xff0c;于是我們就馬不停蹄的去跟新下一篇&#xff01;&#xff01; Session0注入 &#xff1a;&#xff1a; 各位看官如果覺得還不錯的可以給博主點個贊&#x1f495;&#x1f495; 這次&#xff0c;我把這個腳本直接傳到Github上了 喜歡的師傅點個Star噢…

深入理解JS中的防抖節流

在Web開發中,防抖(Debouncing)和節流(Throttling)是兩種常用的優化技術,用于提高頁面性能和用戶體驗。它們通過限制函數執行的頻率來減少計算資源的消耗,尤其是在處理頻繁觸發的事件時,如窗口大小調整、滾動、鍵盤輸入等。 1、防抖(Debouncing) 防抖技術的核心思想是…

風景園林工程設計乙級資質業績要求案例分析

項目數量與規模 數量要求&#xff1a;企業需要提供一定數量的已完成風景園林設計項目案例&#xff0c;這個數量可能依據具體政策而有所不同&#xff0c;但通常需要完成多個項目以展示設計團隊的綜合能力。 規模要求&#xff1a;項目規模需達到乙級資質標準所規定的級別&#…