[alertView release] 後,Instruments 仍報告洩漏,retainCount=3。UIAlertController(iOS 8+)同樣洩漏。UIAlertView 彈出時,系統視窗管理器會強引用持有它,直到使用者點擊按鈕並完成動畫消失。此期間開發者不應手動 release。self 設為 delegate 且未在 alertView:clickedButtonAtIndex: 中置 nil,可能形成循環。UIAlertView 內部可能持有 Core Foundation 物件或 block 導致洩漏。UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"標題"
message:@"訊息"
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
// 處理邏輯
}]];
[self presentViewController:alert animated:YES completion:nil];
UIAlertController 為 View Controller 容器,生命週期由呈現控制器管理,不易洩漏。
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
// 處理完畢後斷開 delegate
alertView.delegate = nil;
}
// 絕不手動 release 已顯示的 alertView
retain/release 歷程。CFRetain/CFRelease 呼叫,找出非 ARC 管理的洩漏源。CSDN 經典分析文:iOS UIAlertView 記憶體洩漏完整解決方案
核心原則:信任系統管理視圖控制器生命週期,避免手動干預 retain/release,優先採用現代 API。