有時應用崩潰,而日志中的輸出信息太少,無法定位問題,這是最頭疼的事情,尤其很累的時侯,已經想不起來剛才改過什麼了,這就叫做無耐。
工欲善其事,必先利其器,下面的方法可以給多些信息,讓你看到堆棧執行順序,在哪裡崩潰的,也就能大概給個思路,確定問題的症結。
在 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);