有時應用崩潰,而日志中的輸出信息太少,無法定位問題,這是最頭疼的事情,尤其很累的時侯,已經想不起來剛才改過什麼了,這就叫做無耐。
工欲善其事,必先利其器,下面的方法可以給多些信息,讓你看到堆棧執行順序,在哪裡崩潰的,也就能大概給個思路,確定問題的症結。
在 AppDelegate.m 類實現之前加入:
void UncaughtExceptionHandler(NSException *exception) { // 獲取異常相關信息 NSArray *callStackSymbols = [exception callStackSymbols]; NSString *callStackSymbolStr = [callStackSymbols componentsJoinedByString:@ ]; NSString *reason = [exception reason]; NSString *name = [exception name]; // 獲取系統當前時間 NSDate * date = [NSDate date]; NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init ]; [dateFormatter setDateFormat:@yyyy年MM月dd日 HH小時mm分ss秒]; NSString * dateStr = [dateFormatter stringFromDate:date]; NSLog(@系統當前時間為:%@ ,dateStr); NSLog(@異常名稱:%@ ,name); NSLog(@異常原因:%@ ,reason); NSLog(@堆棧標志:%@ ,callStackSymbolStr); }
在 AppDelegate.m 類實現的應用啟動方法中加入如下語句,為系統設置異常回調函數為上面的聲明,詳細說明見 “iOS Foundation 框架概述文檔:常量、數據類型、框架、函數、發布聲明”:
@implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);