OC 採用參考計數管理記憶體,分為手動 (MRC) 與自動 (ARC) 兩種模式。核心原則:**誰分配/保留,誰負責釋放**。
retainCount:物件被保留次數。alloc/new/copy/mutableCopy/retain → +1;release/autorelease → -1。dealloc 釋放資源。nil/NULL/0,發送訊息安全無效果。| 操作 | 計數變化 | 所有權轉移 |
|---|---|---|
| alloc / new / copy / mutableCopy | +1 | 獲得所有權 |
| retain | +1 | 聲明所有權 |
| release | -1 | 放棄所有權 |
| autorelease | 延遲 -1 | 放棄所有權,稍後由池釋放 |
- (void)dealloc {
NSLog(@"%@ dealloc", _name);
[_name release]; // 釋放持有物件
[super dealloc]; // 必須最後呼叫
}
// 現代語法 (ARC/MRC 通用)
@autoreleasepool {
// 區塊內 autorelease 物件在區塊結束時釋放
}
// 舊式 MRC 手動池
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// ...
[pool release]; // 觸發池內所有物件 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;
}
strong (預設, 保留), weak (不保留, 物件釋放自動置 nil), unsafe_unretained (不保留, 不置 nil), __autoreleasing (參數傳遞)。weak。NSString, NSArray) 採用 copy 屬性防止外部修改。@autoreleasepool 避免記憶體峰值。CFRetain/CFRelease 或 __bridge 轉換。