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

Objective-C 記憶體管理精要:MRC、ARC、自動釋放池與複製語義

     編輯:關於C語言

Objective-C 記憶體管理精要:MRC、ARC、自動釋放池與複製語義

OC 採用參考計數管理記憶體,分為手動 (MRC) 與自動 (ARC) 兩種模式。核心原則:**誰分配/保留,誰負責釋放**。

核心概念

  • retainCount:物件被保留次數。alloc/new/copy/mutableCopy/retain → +1;release/autorelease → -1。
  • 計數歸零 → 自動呼叫 dealloc 釋放資源。
  • 僵屍物件:已釋放記憶體,指標懸空 → 崩潰風險。
  • 空指標:nil/NULL/0,發送訊息安全無效果。

MRC 手動管理規則

操作計數變化所有權轉移
alloc / new / copy / mutableCopy+1獲得所有權
retain+1聲明所有權
release-1放棄所有權
autorelease延遲 -1放棄所有權,稍後由池釋放

標準 dealloc 實現

- (void)dealloc {
    NSLog(@"%@ dealloc", _name);
    [_name release]; // 釋放持有物件
    [super dealloc]; // 必須最後呼叫
}

自動釋放池

// 現代語法 (ARC/MRC 通用)
@autoreleasepool {
    // 區塊內 autorelease 物件在區塊結束時釋放
}

// 舊式 MRC 手動池
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// ...
[pool release]; // 觸發池內所有物件 release

autorelease vs release

  • release:立即 -1,可能觸發 dealloc。
  • autorelease:將物件加入當前池,池排空時 才 -1。適用於「製造者不持有、回傳給呼叫端」的工廠方法。

複製語義

  • 淺複製:return [self retain]; 指標共享,不可變物件適用。
  • 深複製:分配新物件,遞歸複製內容。需實作 NSCopying 協議:
- (id)copyWithZone:(NSZone *)zone {
    Person *p = [[[self class] allocWithZone:zone] init];
    p.name = [self.name copy]; // 字串也需深複製
    p.age = self.age;
    return p;
}

ARC 自動參考計數

  • 編譯器自動插入 retain/release/autorelease,禁用手動呼叫。
  • 關鍵字:strong (預設, 保留), weak (不保留, 物件釋放自動置 nil), unsafe_unretained (不保留, 不置 nil), __autoreleasing (參數傳遞)。
  • 循環保留解決:父強子弱,Delegate/Block 使用 weak。

實戰建議

  1. 優先使用 ARC,專注業務邏輯。
  2. 不可變類別 (NSString, NSArray) 採用 copy 屬性防止外部修改。
  3. 大量臨時物件迴圈中,手動加 @autoreleasepool 避免記憶體峰值。
  4. Core Foundation 物件需 CFRetain/CFRelease 或 __bridge 轉換。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved