iOS 異常初探

雖然我們都不想我們編寫的應用發(fā)生crash,但是crash是在所難免的。iOS系統(tǒng)對于crash有兩種處理方式,一種是由EXC_BAD_ACCESS引起的,多為內(nèi)存問題;另一種是未被捕獲的Objective-C異常(NSException),導致程序向自身發(fā)送了SIGABRT信號而崩潰。我們需要了解一下如何獲取crash信息。

當我們想在crash之前做某些操作的時候比如發(fā)送錯誤日志到郵件或者本地保存日志的時候,我們就可以使用系統(tǒng)的一個方法去實現(xiàn)。系統(tǒng)有一個名為NSSetUncaughtExceptionHandler的方法,是用于注冊在crash時調(diào)用什么方法的。一般來說是在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions這個方法里去注冊如

-?(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

NSSetUncaughtExceptionHandler(要執(zhí)行的函數(shù)名);

return YES;

}


為了方便使用我們可以定義一個類來處理異常這個類繼承NSObject,然后在這個內(nèi)部注冊異常處理函數(shù)及實現(xiàn)想要的操作。

上面的注冊換成定義的類的注冊方法即可例如下面的startLog

#import "MyCrashLog.h"

#import<sys/signal.h>

@implementation MyCrashLog

+ (void)startLog

{

dispatch_once_t one;

dispatch_once(&one, ^{

//注冊異常

NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

//可添加信號量異常注冊

});

}

static void uncaughtExceptionHandler(NSException *exception)

{

/ NSLog(@"異常:%@---",exception);

截獲到異常 , 發(fā)生crash時會自動調(diào)用此方法名稱自己可定義 但是要和注冊的名稱一樣

在此處處理異常,根據(jù)自己的需求

}

@end

上面的代碼只是注冊和處理了EXC_BAD_ACCESS異常


要處理SIGABRT信號也是如同上面一樣注冊信號異常只是函數(shù)名不一樣

在上述代碼注冊的時候添加類似

//注冊信號量

signal(SIGABRT, headleSing);

signal(SIGPROF, headleSing);

signal(SIGPROF, headleSing);

的代碼就可以注冊相應的信號量了,其中headleSing為自定義的處理異常的信號的函數(shù)名

信號量有很多種可以按需求去注冊

到此對于異常的獲取結(jié)束

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載(漫談 iOS Crash 收集框架) 前言 很早以前就和念茜認識,念茜不但技術(shù)功底扎實,而且長得很漂亮,說她...
    狂風無跡閱讀 3,377評論 1 11
  • 以下為文章正文,如果覺得有用,歡迎給她打賞。 為了能夠第一時間發(fā)現(xiàn)程序問題,應用程序需要實現(xiàn)自己的崩潰日志收集服務...
    赤色追風閱讀 2,568評論 1 11
  • 來源:程序媛念茜的博客 Crash日志收集 為了能夠第一時間發(fā)現(xiàn)程序問題,應用程序需要實現(xiàn)自己的崩潰日志收集服務,...
    幸福的魚閱讀 1,185評論 0 2
  • 比較好的轉(zhuǎn)載:http://www.cocoachina.com/ios/20151218/14748.html轉(zhuǎn)...
    liudhkk閱讀 937評論 0 2
  • 文章目錄 一. 系統(tǒng)Crash 二. 處理signal 下面是一些信號說明 關(guān)鍵點注意 三. 實戰(zhàn) 四. Cras...
    MTDeveloper閱讀 1,168評論 1 2