每個對象有一個引用計數器。擁有者負責在不再需要時釋放所有權。計數歸零 → 對象銷毀 (dealloc)。
方法名以 alloc, new, copy, mutableCopy 開頭 → 返回對象擁有權歸調用者 (retainCount +1)。
MyClass *obj = [[MyClass alloc] init]; // 擁有 NSString *s = [NSString stringWithString:s]; // 擁有 (copy)
retain 獲取所有權非創建方法獲取的對象 (如工廠方法、屬性 getter) 通常為自動釋放池管理。若需長期持有,必須 retain。
// 屬性設置器典型實現
- (void)setName:(NSString *)newName {
if (_name != newName) {
[newName retain]; // 獲取所有權
[_name release]; // 釋放舊值所有權
_name = newName;
}
}
release:立即減計數,歸零即銷毀autorelease:延遲釋放,放入當前自動釋放池,池排空時發送 release// 便利構造器模式
+ (instancetype)object {
return [[[self alloc] init] autorelease]; // 移交所有權給池
}
過度 release → 過早銷毀 → 崩潰 (EXC_BAD_ACCESS)。靜態分析器 可捕獲大部分此類錯誤。
@autoreleasepool { ... }編譯器自動插入 retain/release/autorelease。核心規則轉化為所有權修飾符:
| 修飾符 | 語義 | MRR 等價 |
|---|---|---|
__strong (預設) | 持有強引用,擁有所有權 | retain 入,release 出 |
__weak | 非擁有引用,對象銷毀自動置 nil | 不 retain,不阻止銷毀 |
__unsafe_unretained | 非擁有引用,銷毀不置 nil (危險) | 僅賦值 |
__autoreleasing | 參數傳遞用,自動釋放池管理 | autorelease |
strong 子,子 weak 父__weak typeof(self) weakSelf = self; 在 Block 內使用 weakSelf@property (weak) id<Delegate> delegate;strong,代理/外部引用用 weakinit/dealloc 中直接訪問實例變數 (_ivar),避免觸發 KVO/副作用@autoreleasepool 釋放臨時對象