首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS View Controller 轉場崩潰 SIGABRT 完整排查指南

     編輯:程式設計綜合問答

現象重現

使用 presentViewController:animated:completion: 呈現第二個 VC,點擊返回(dismissViewControllerAnimated:completion:)時,App 崩潰並輸出 Thread 1: Program received signal: "SIGABRT"。XIB 已正確連接 Outlet/Action。

常見原因與解決方案

1. 重複初始化 View Controller(最可能原因)

原始碼中在 AppDelegate 已建立 self.secondView,但在第一個 VC 的跳轉邏輯中 又 new 了一個實例:

// 錯誤示範
SecondViewController *second = [[SecondViewController alloc] init]; // 新實例,非 AppDelegate 那個
[self presentViewController:second animated:YES completion:^{}];

導致:

  • 呈現的 VC 與 XIB 綁定的 Outlet 可能未正確載入(若用 init 而非 initWithNibName:bundle:)。
  • 返回時嘗試 dismiss 的是臨時實例,而持有強引用的 self.secondView 從未被呈現,生命週期混亂觸發崩潰。

修正:直接使用 AppDelegate 中已建立的實例,或統一用 Storyboard/XIB 載入:

// 正確做法 A:從 AppDelegate 取得
AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
[self presentViewController:app.secondView animated:YES completion:^{}];

// 正確做法 B:現代開發建議用 Storyboard + Segue,完全避免手動管理實例

2. XIB 檔案未加入 Target Membership

檢查 SecondViewController.xib 在 File Inspector → Target Membership 是否勾選專案 Target。未勾選會導致 initWithNibName: 找不到 nib,回傳 nil,後續操作崩潰。

3. 記憶體管理:循環引用或過早釋放

  • 若在 completion block 中捕獲 self 造成強循環,需用 __weak typeof(self) weakSelf = self;。
  • 確認 secondView 在 AppDelegate 中是 strong 屬性,不會被過早釋放。

4. 斷點調試定位崩潰行

  1. 開啟 Exception Breakpoint(左側導航欄 Breakpoint Navigator → + → Exception Breakpoint)。
  2. 重現崩潰,Xcode 會停在拋出異常的確切行(如 objc_msgSend、-[UIViewController view] 等)。
  3. 查看 Console 輸出的 *** Terminating app due to uncaught exception 'NSInvalidArgumentException'... 具體訊息。

新手學習建議:官方範例優於舊書/部落格

原詢問者提到「書版本太舊、看部落格仍出錯」。強烈建議:

  1. Xcode → Help → Documentation and API Reference。
  2. 搜尋 UICatalog。
  3. 點擊 Open Project,Xcode 自動下載並開啟完整專案。
  4. 該範例包含所有 UIKit 控制項的標準用法,同時提供 Objective-C 與 Swift 双版本,且隨 iOS SDK 更新同步維護。

UICatalog 範例專案截圖

結語

iOS View Controller 轉場崩潰 90% 源於「實例管理混亂」或「XIB 載入失敗」。採用 Storyboard + Segue 或統一工廠方法建立 VC,並善用官方 UICatalog 範例學習最佳實踐,能從根本上避免此類低級錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved