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

iOS 5.1 模擬器 presentViewController 崩潰排查指南

     編輯:程式設計綜合問答

崩潰現場

- (IBAction)SwitchView:(id)sender {
    SecondView *second = [[SecondView alloc] initWithNibName:nil bundle:nil];
    [self presentViewController:second animated:YES completion:NULL];
}

點擊按鈕後模擬器直接退出,無異常日誌。

核心問題

  1. initWithNibName:nil bundle:nil:若 SecondView 無對應 xib,會嘗試加載同名 xib 失敗,導致 view 為 nil,present 時崩潰。
  2. SecondView 非 UIViewController 子類:僅繼承 UIView 卻嘗試 present,運行時會拋出 NSInvalidArgumentException。

修正代碼

- (IBAction)SwitchView:(id)sender {
    // 1. 純代碼創建,不依賴 nib
    SecondViewController *second = [[SecondViewController alloc] init];
    // 2. 確保是 UIViewController 子類
    [self presentViewController:second animated:YES completion:nil];
}

檢查清單

  • ☑ SecondViewController : UIViewController(注意拼寫)。
  • ☑ 重寫 loadView 或 viewDidLoad 構建 UI,而非依賴 xib。
  • ☑ iOS 5.1 模擬器已知 Bug:presentViewController:animated:completion: 在某些設備上 completion 為 NULL 會崩潰 → 傳 ^{} 空 Block 代替。

調試技巧

  1. 啟用 Zombie Objects:Scheme → Diagnostics → Enable Zombie Objects,捕獲釋放後訪問。
  2. 添加 Exception Breakpoint:Breakpoint Navigator → + → Exception Breakpoint,定位拋出異常行。
  3. 查看 Console 輸出:即使模擬器關閉,Xcode 控制台仍保留崩潰堆疊。

總結

崩潰 90% 因「非 VC 類 present」或「nib 加載失敗」。改用 init 純代碼創建 VC,傳入空 Block 兼容舊版模擬器,即可穩定復現。

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