首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 內存管理機制深度解析:ARC、MRR 與自動釋放池

     編輯:關於C語言

Objective-C 內存管理機制深度解析:ARC、MRR 與自動釋放池

Objective-C 提供三種內存管理模式,現代開發以 ARC 為主,理解底層機制對調試洩漏、循環引用至關重要。

1. 手動引用計數(MRR,Manual Retain-Release)

核心規則:你創建、你持有、你負責釋放。

  • alloc/new/copy/mutableCopy → 引用計數 +1,你擁有所有權
  • retain → 顯式聲明持有,計數 +1
  • release → 放棄持有,計數 -1;歸零時調用 dealloc
  • autorelease → 延遲釋放,加入當前自動釋放池

判斷所有權:方法名以 alloc、new、copy、mutableCopy 開頭 → 返回對象歸調用者所有;否則(如 [NSString string]、[NSArray arrayWithObject:])返回自動釋放對象,調用者不持有,若需持有需手動 retain。

2. 自動引用計數(ARC,Automatic Reference Counting)

編譯器(Clang)在編譯期自動插入 retain/release/autorelease,開發者無需(也不可)手動調用。核心所有權修飾符:

ARC 禁用:retain/release/autorelease/retainCount/dealloc(可重寫 dealloc 但不可調用 [super dealloc])。

3. 自動釋放池(@autoreleasepool)

作用域機制,延遲釋放 autorelease 對象。池可巢狀,內層池先銷毀。

@autoreleasepool {
    // 循環大量創建臨時對象
    for (int i = 0; i < 10000; i++) {
        NSString *s = [NSString stringWithFormat:@"Item %d", i];
        // s 為自動釋放對象,池排空時釋放
    }
} // 此處池排空,釋放所有 autorelease 對象

主運行循環每次迭代自動創建/銷毀池;長時間運行的後台線程需手動創建池防止內存峰值。

對比總結表

修飾符語義適用場景
__strong強引用(默認),持有所有權普通對象屬性、局部變量
__weak弱引用,不持有,對象銷毀自動置 nil打破循環引用(delegate、block 回調 self)
__unsafe_unretained弱引用,不置 nil(危險,懸空指針)極少用,兼容舊代碼
__autoreleasing自動釋放池引用雙指針輸出參數(NSError **)
特性MRRARCGarbage Collection (已棄用)
機制程序員手動管理編譯器靜態插入運行時掃描回收
性能可預測,無額外開銷編譯期優化,極低開銷不可預測停頓,資源消耗大
iOS 支持早期版本iOS 5+ / OS X 10.7+ 全面支持僅 Mac 64-bit,iOS 不支持
循環引用手動打破__weak 自動打破自動處理

常見陷阱與最佳實踐

  • Block 捕獲 self:__weak typeof(self) weakSelf = self; 在 block 內使用 weakSelf
  • Delegate 屬性:必須聲明 @property (weak) id delegate;
  • Core Foundation 對象:ARC 不管理,需 CFRetain/CFRelease 或 __bridge 轉換
  • @autoreleasepool 粒度:大循環、圖片處理、網絡請求批次中顯式添加
  • 調試工具:Instruments → Leaks / Allocations / Zombies
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved