weak的實現原理

?????????iOS 在運行時維護著一個全局的弱引用表,該表是一個 hash 表,hash表的?key 是 對象本身,value 是指向該對象的所有 weak 指針的地址數組。???
/**全局的弱引用表,本質是一個hash結構,對象本身作為key, 存儲weak修飾的指針地址的weak_entry_t作為value*/
struct weak_table_t {// 保存了所有指向特地對象的 weak指針集合weak_entry_t *weak_entries;// hash數組中元素個數size_t num_entries;// hash數組的長度,而不是元素個數。比如,數組長度可能是64,而元素個數僅存了2個uintptr_t mask;// hash沖突最大次數, hash數組采用開放定址法解決hash沖突uintptr_t max_hash_displacement;
};
? ? ? ? 以下述代碼為例:
NSObject * obj =  [[NSObject alloc] init];__weak NSObject *p1 = obj;
__weak NSObject *p2 = obj;NSObject ** referrer1 = &p1;
NSObject ** referrer2 = &p2;[obj release];

? ? ? ? ?hash表的key為obj,hash表的值weak_entries的referers屬性被賦值為[referrer1, referrer2];

????????當weak修飾的對象obj被銷毀時,iOS在運行時會從哈希表中查找到所有指向此對象的 weak 指針,并將其全部置為空?nil,即通過執行*referrer1 = NULL和*referrer2?= NULL,實現將p1和p2置為NULL。
weak_clear_no_lock(weak_table_t *weak_table, id referent_id) {// 在weak_table中對應的weak_entry_tobjc_object *referent = (objc_object *)referent_id;weak_entry_t *entry = weak_entry_for_referent(weak_table, referent); weak_referrer_t referrers = entry->referrers;int count = TABLE_SIZE(entry);for (size_t i = 0; i < count; ++i) {objc_object **referrer = referrers[i]; if (referrer) {// 如果weak指針確實弱引用了對象 referent,則將weak指針設置為nilif (*referrer == referent) { *referrer = nil;}}}
}

? ? ? ? iOS在ARC下通過引入weak標識, 大大減少了以前retain或assign標識的對象在被銷毀后可能出現野指針的情況,進而有效提升了代碼健壯性。

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

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

相關文章

大模型訓練經驗

1.模型訓練好后預測全是起始符號。 解決辦法&#xff1a;訓練數據的輸入輸出去掉起始符號。 2.模型訓練后學不到有效信息。 加大epoch&#xff0c;我加大到了1000。 3.模型訓練后預測沒有結束符&#xff0c;暫時未解&#xff0c;另外&#xff0c;發現當訓練不足時&#xff…

Metasploit安裝及使用教程(非常詳細)從零基礎入門到精通,看完這一篇就夠了。

通過本篇文章&#xff0c;我們將會學習以下內容&#xff1a; 1、在Windows上安裝Metasploit 2、在Linux和MacOS上安裝Metasploit 3、在Kali Linux中使用 Metasploit 4、升級Kali Linux 5、使用虛擬化軟件構建滲透測試實驗環境 6、配置SSH連接 7、使用SSH連接Kali 8、配…

如何學習自然語言處理之語言模型

自然語言處理&#xff08;NLP&#xff09;是一種人工智能技術&#xff0c;它使計算機能夠理解和處理人類語言。而語言模型是NLP中的一個重要概念&#xff0c;主要是用來估測一些詞的序列的概率&#xff0c;即預測p(w1, w2, w3 … wn)&#xff0c;其中一個應用就是句子的生成。 …

JVM運行流程

? 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主頁&#xff1a;小胡_不糊涂的個人主頁 &#x1f4c0; 收錄專欄&#xff1a;JavaEE &#x1f496; 持續更文&#xff0c;關注博主少走彎路&#xff0c;謝謝大家支持 &#x1f496; JVM 1. 運行流程2. 運行時數據區2.1 堆&am…

ubuntu新建ap熱點并分享

測試環境ubuntu16,只有一臺筆記本電腦&#xff0c;不插網線&#xff0c;無線網卡既連wifi&#xff0c;又作為熱點 1.方法1 直接手動新建ap熱點 參考https://jingyan.baidu.com/article/ea24bc39b03fc6da62b331f0.html https://jingyan.baidu.com/article/363872ecd8f35d6e4ba…

機試指南:Ch5:線性數據結構 Ch6:遞歸與分治

文章目錄 第5章 線性數據結構1.向量 vector2.隊列 queue(1)隊列的特點、應用(2)基本操作(3)例題例題1&#xff1a;約瑟夫問題2 &#xff08;難度&#xff1a;中等&#xff09; (4)習題習題1&#xff1a;排隊打飯 &#xff08;難度&#xff1a;中等&#xff09; 3.棧 stack(1)棧…

前端 JS 經典:Content-type 詳解

1. 什么是 Content-Type Content-Type 是 HTTP 協議中的一個請求頭或響應頭字段&#xff0c;用于指示發送或接收的實體的媒體類型&#xff0c;告訴服務器或客戶端如何解析和處理請求或響應的主體部分。 2. Content-Type 的構成 Content-Type 由兩部分組成&#xff1a;媒體類型…

視頻在線壓縮

video2edit 一款免費的在線視頻編輯軟件&#xff0c;可以進行視頻合并、視頻剪輯、視頻壓縮以及轉換視頻格式等。 鏈接地址&#xff1a;在線視頻編輯器和轉換器 - 編輯&#xff0c;轉換和壓縮視頻文件 打開視頻壓縮頁面&#xff0c;上傳想要壓縮視頻&#xff0c;支持MP4&…

收入穩步增長 助力持續發展 尼康發布截至2024年3月財年第三季度財報

近日&#xff0c;尼康截至2024年3月財年的第三季度&#xff08;2023年10月1日-2023年12月31日&#xff09;財報正式發布。數據顯示&#xff0c;尼康集團第三財季銷售收入共計1977億日元&#xff0c;較去年同期上漲300億日元&#xff0c;漲幅約17.9%。其中影像業務領域&#xff…

Java面試題:解釋Java內存模型中的內存順序規則,Java中的線程組(ThreadGroup)的工作原理,Java中的FutureTask的工作原理

引言 在Java開發領域&#xff0c;內存模型、多線程和并發是三個至關重要的概念&#xff0c;它們直接影響到程序的性能、穩定性和可擴展性。作為面試官&#xff0c;考察候選人對這些概念的理解和應用能力是評估其技術水平的重要手段。本文將提供三道涉及這些核心知識點的面試題…

視頻記錄儀_基于聯發科MT6762的智能4G記錄儀方案

智能記錄儀采用聯發科強勁八核處理器&#xff0c;12nm制程工藝的記錄儀具便是滿足這些需求的理想選擇。搭載4GB32GB內存&#xff0c;并運行Android 11.0操作系統&#xff0c;這款記錄儀具展現出強勁的性能表現。 首先&#xff0c;這款記錄儀具具備優秀的視頻錄制功能。它能完整…

WPS如何共享文件和文件夾

1 WPS共享單個文件 用WPS打開要分享的文件&#xff0c;點擊右上角的“分享”鍵&#xff0c;選擇上傳到云端。 之后點擊“創建并分享”&#xff0c;即可分享該文檔。 2 WPS創建共享文件夾 2.1 如何共享文件夾 首先打開WPS&#xff0c;點擊左上角的首頁。在首頁欄中&#…

Ubuntu系統下DPDK環境搭建

目錄 一.虛擬機配置1.添加一個網卡(橋接模式)2.修改網卡類型3.修改網卡名稱4.重啟虛擬機5.查看網卡信息6.dpdk配置內存巨型頁 三 DPDK源代碼下載和編譯1.下載源代碼2.解壓源代碼3.安裝編譯環境4.編譯5.設置dpdk的環境變量6.禁止多隊列網卡7.加載igb_uio模塊8.網卡綁定9.驗證測試…

Vue3自定義文章列表組件

一、Vue3的代碼展示 <template><div><div v-for"article in articles" :key"article.id" class"article-card"><div class"author-info"><img :src"article.avatar" alt"Author Avatar&qu…

Android 驗證啟動模式

文章目錄 Android 驗證啟動模式查看任務棧launchModestandardsingleTopsingleTasksingleInstance Intent標記FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK 和 FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP Android 驗證啟動模式 查看任務棧 可…

軟考52-上午題-【數據庫】-關系模式2

一、關系模式的回顧 見&#xff1a;軟考38-上午題-【數據庫】-關系模式 二、關系模式 2-1、關系模式的定義 示例&#xff1a; 念法&#xff1a;A——>B A決定B&#xff0c;或者&#xff0c;B依賴于A。 2-2、函數依賴 1、非平凡的函數依賴 如果X——>Y&#xff0c;&a…

Linux Shell腳本練習(三)

1、測試用戶名與密碼是否正確。 2、輸出1-1000內的素數。 3、對 100 以內的所有正整數相加求和(1234...100)。 4、輸出9*9 乘法表。 5、編寫腳本,顯示進度條。 、 6、輸入三個數并進行升序排序

RocketMQ - 深入研究一下生產者到底如何發送消息的

1. 創建Topic的時候為何要指定MessageQueue數量 首先如果要搞明白生產者的工作原理,那么就必須先明白一個概念,MessageQueue是什么? 而要明白MessageQueue是什么,就必須把他跟Topic以及Broker綜合起來看,才能搞明白。如果我們要使用RocketMQ,你先部署出來一套RocketMQ集…

C++高級面試題:解釋 C++ 中的智能指針循環引用問題,并介紹如何解決它

解釋 C 中的智能指針循環引用問題&#xff0c;并介紹如何解決它 智能指針循環引用問題指的是兩個或多個對象之間相互持有對方的智能指針&#xff0c;導致內存泄漏的情況。當使用智能指針時&#xff0c;如果對象之間存在循環引用關系&#xff0c;可能會造成內存泄漏&#xff0c…

附詳細答案,最新BAT大廠面試者整理的Android面試題目

前言 前幾年移動互聯網創業的風口&#xff0c;如今漸漸消失&#xff0c;移動互聯網被巨頭公司瓜分&#xff0c;一些創業公司倒閉了&#xff0c;Android 開發需求慢慢趨近于飽和。而當初移動互聯網處于風口時&#xff0c;自學、轉行以及培訓機構出來了大量 Android 開發從業者&…