Objective-C使用塊枚舉的細節

對元素類型的要求

在 Objective-C 中,NSArray 只能存儲對象類型,而不能直接存儲基本類型(例如 int)。但是,可以將基本類型封裝在 NSNumber 等對象中,然后將這些對象存儲在 NSArray 中。這樣,enumerateObjectsUsingBlock: 方法中的 obj 仍然是指向這些對象的指針。

NSArray *array = @[@1, @2, @3];
[array enumerateObjectsUsingBlock:^(NSNumber *obj, NSUInteger idx, BOOL *stop) {int value = [obj intValue];NSLog(@"Object: %@, Int Value: %d, Address: %p", obj, value, obj);
}];

obj 是一個指針變量,局部變量

obj 和 array 中對應位置的元素指向相同的內存地址,但它們不是同一個指針變量,而是兩個指向同一對象的不同變量。

在 -enumerateObjectsUsingBlock: 方法中,塊枚舉會遍歷數組,并將每個元素的指針賦值給 obj。因此,obj 是一個局部變量,在每次迭代時指向數組中當前遍歷的元素。盡管它們指向同一對象,但 obj 是塊中的局部變量,而數組中的元素是數組中的存儲單元。

NSArray *array = @[@"one", @"two", @"three"];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {NSLog(@"Object: %@, obj Address: %p, obj Pointer Address: %p, array[idx] Address: %p, array[idx] pointer Address: %p", obj, obj, &obj, array[idx], &array[idx]);
}];

循環引用問題

在 Objective-C 中使用 enumerateObjectsUsingBlock 時,同樣需要注意循環引用問題。enumerateObjectsUsingBlock 會將塊傳遞給枚舉方法,如果塊捕獲了對自身或外部對象的強引用,這可能導致循環引用,尤其是當這個對象也強引用調用該塊的對象時。

示例說明

假設有一個類 MyClass,其實例方法使用 enumerateObjectsUsingBlock

@interface MyClass : NSObject
@property (nonatomic, strong) NSArray *array;
@end@implementation MyClass- (void)enumerateArray {[self.array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {// 這里使用了 selfNSLog(@"%@", self);}];
}@end

在上述代碼中,塊捕獲了 self 的強引用。如果 self 對象持有 array,這就形成了一個循環引用,導致 self 無法被釋放。

解決方案

使用弱引用來打破循環引用,可以使用 __weak__block 關鍵字:

@implementation MyClass- (void)enumerateArray {__weak typeof(self) weakSelf = self;[self.array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {// 這里使用了弱引用的 self__strong typeof(weakSelf) strongSelf = weakSelf;if (strongSelf) {NSLog(@"%@", strongSelf);}}];
}@end

在這個修改后的代碼中,使用 __weakself 的弱引用傳遞到塊內,然后在塊內將其轉換為強引用以確保在使用過程中對象的生命周期被正確管理。

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

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

相關文章

Maven編譯打包時報“PKIX path building failed”異常

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 方法11.報錯信息2.InstallCert.java3.生成證書文件 jssecacerts4.復制 jssecacerts 文件5. 然后重啟Jenkins 或者maven即可 方法21.下載證書2. 導入證書執行keytool…

7.優化算法之分治-快排歸并

0.分治 分而治之 1.顏色分類 75. 顏色分類 - 力扣(LeetCode) 給定一個包含紅色、白色和藍色、共 n 個元素的數組 nums ,原地對它們進行排序,使得相同顏色的元素相鄰,并按照紅色、白色、藍色順序排列。 我們使用整數…

Elasticsearch (1):ES基本概念和原理簡單介紹

Elasticsearch(簡稱 ES)是一款基于 Apache Lucene 的分布式搜索和分析引擎。隨著業務的發展,系統中的數據量不斷增長,傳統的關系型數據庫在處理大量模糊查詢時效率低下。因此,ES 作為一種高效、靈活和可擴展的全文檢索…

PHP爬蟲類的使用技巧與注意事項

php爬蟲類的使用技巧與注意事項 隨著互聯網的迅猛發展,大量的數據被不斷地生成和更新。為了方便獲取和處理這些數據,爬蟲技術應運而生。PHP作為一種廣泛應用的編程語言,也有許多成熟且強大的爬蟲類庫可供使用。在本文中,我們將介…

Qt Creator 的設置文件保存位置

在使用 Qt Creator 進行開發時,備份或遷移設置(例如文本編輯器偏好、語法高亮等)是常見需求。了解這些設置文件在不同操作系統中的保存位置,可以簡化這個過程。本文將為您詳細介紹 Qt Creator 保存設置文件的位置。 默認文件位置 Qt Creator 會創建多個文件和目錄來存儲其…

springboot系列八: springboot靜態資源訪問,Rest風格請求處理, 接收參數相關注解

文章目錄 WEB開發-靜態資源訪問官方文檔基本介紹快速入門注意事項和細節 Rest風格請求處理基本介紹應用實例注意事項和細節思考題 接收參數相關注解基本介紹應用實例PathVariableRequestHeaderRequestParamCookieValueRequestBodyRequestAttributeSessionAttribute ?? 上一篇…

微服務-網關Gateway

個人對于網關路由的理解: 網關就相當于是一個項目里面的保安,主要作用就是做一個限制項。(zuul和gateway兩個不同的網關) 在路由中進行配置過濾器 過濾器工廠:對請求或響應進行加工 其中filters:過濾器配置…

探索QCS6490目標檢測AI應用開發(三):模型推理

作為《探索QCS6490目標檢測AI應用開發》文章,緊接上一期,我們介紹如何在應用程序中介紹如何使用解碼后的視頻幀結合Yolov8n模型推理。 高通 Qualcomm AI Engine Direct 是一套能夠針對高通AI應用加速的軟件SDK,更多的內容可以訪問&#xff1a…

摸魚大數據——Spark基礎——Spark環境安裝——PySpark搭建

三、PySpark環境安裝 PySpark: 是Python的庫, 由Spark官方提供. 專供Python語言使用. 類似Pandas一樣,是一個庫 Spark: 是一個獨立的框架, 包含PySpark的全部功能, 除此之外, Spark框架還包含了對R語言\ Java語言\ Scala語言的支持. 功能更全. 可以認為是通用Spark。 功能 P…

Golang | Leetcode Golang題解之第199題二叉樹的右視圖

題目: 題解: /** 102. 二叉樹的遞歸遍歷*/ func levelOrder(root *TreeNode) [][]int {arr : [][]int{}depth : 0var order func(root *TreeNode, depth int)order func(root *TreeNode, depth int) {if root nil {return}if len(arr) depth {arr a…

線性代數--行列式1

本篇來自對線性代數第一篇的行列式的一個總結。 主要是行列式中有些關鍵點和注意事項,便于之后的考研復習使用。 首先,對于普通的二階和三階行列式,我們可以直接對其進行拆開,展開。 而對于n階行列式 其行列式的值等于它的任意…

每個架構師都應該讀的八本經典書籍

格雷戈爾霍普在本文討論了8本被視為軟件架構師必讀的經典書籍。 以下是所提及的關鍵書籍的摘要: 1、維特魯威(公元前 20 年)的《建筑學》: 雖然與軟件架構沒有直接關系,但這部古代文獻被提及,具有歷史背景…

C++特殊類設計單例模式...

文章目錄 請設計一個類,不能被拷貝請設計一個類,只能在堆上創建對象請設計一個類,只能在棧上創建對象請設計一個類,不能被繼承請設計一個類,只能創建一個對象(單例模式)單例模式:餓漢模式:懶漢模…

代發考生戰報:6月25號 南寧 HCIP-Transmission傳輸 H31-341考試884分通過

代發考生戰報:6月25號 南寧 HCIP-Transmission傳輸 H31-341考試884分通過 ,今天我和同事兩個人去考的,我考試遇到1個新題,他遇到兩個新題,客服提供的題庫很穩定,全覆蓋了,輕松通過,考…

【語言模型】Xinference的部署過程

一、引言 Xinference,也稱為Xorbits Inference,是一個性能強大且功能全面的分布式推理框架,專為各種模型的推理而設計。無論是研究者、開發者還是數據科學家,都可以通過Xinference輕松部署自己的模型或內置的前沿開源模型。Xinfe…

pikachu靶場 利用Rce上傳一句話木馬案例(工具:中國蟻劍)

目錄 一、準備靶場,進入RCE 二、測試寫入文件 三、使用中國蟻劍 一、準備靶場,進入RCE 我這里用的是pikachu 打開pikachu靶場,選擇 RCE > exec "ping" 測試是否存在 Rce 漏洞 因為我們猜測在這個 ping 功能是直接調用系統…

性能評測系列:云架構擴展演進橫向對比

原始測評報告 性能評測系列(PT-010):Spring Boot RDS for MySQL,高并發insert 性能評測系列(PT-012):Spring Boot(K8s多實例) RDS for MySQL,高并發insert 性能評測系列&#xff…

一元線性回歸-R語言

# # 安裝包 # install.packages(ggplot2) # library(ggplot2) Sys.setlocale(category LC_ALL, locale English_United States.1252) # Sys.setlocale("LC_ALL","Chinese") x <- c(18, 20, 22, 24, 26, 28, 30) y <- c(26.86, 28.35, 28.87,28.75,…

Linux——vim的配置文件+異常處理

vim的配置文件&#xff1a; [rootserver ~]# vim /etc/vimrc # 輸入以下內容 set nu # 永久設置行號 shell [rootserver ~]# vim /etc/vimrc 或者 vim ~/.vimrc set hlsearch "高亮度反白 set backspace2 "可隨時用退格鍵刪除 set autoindent…

期貨的杠桿怎么計算?

什么是杠桿系數 杠桿系數是指期貨合約價值與保證金之間的比例。它表示投資者只需投入少量資金&#xff0c;就可以控制價值更高的期貨合約。杠桿系數越高&#xff0c;投資者的資金放大倍數就越大&#xff0c;但風險也越大。 什么是期貨保證金呢&#xff1f; 期貨保證金&…