我們都知道當我們的程序運行出現某些錯誤時會發生異常crash(崩潰),可是你有沒有考慮過什么樣的錯誤會產生crash?crash的本質又是什么?當應用上線后我們可以借助諸如bugly、crashlytics等三方工具來監控crash產生時的堆棧信息,那么應用未上線debug階段時我們又該如何防范異常的發生呢?

我們提供的服務有:成都網站設計、成都網站建設、微信公眾號開發、網站優化、網站認證、望都ssl等。為1000+企事業單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的望都網站制作公司
這些問題接下來我們將一一解答。
內核監測到錯誤的產生,向程序所在的進程發送停止運行程序的 消息 。
而發生錯誤的種類分為三種:
1. Mach異常:當試圖讀取不是映射給當前對應程序的內存時,Mach向進程發出????????EXC_BAD_ACCESS異常消息。
2. BSD異常:程序自身檢測出錯誤,向內核BSD層發送信號,BSD再向進程發出的消息。
3. 其他進程異常。
針對異常的產生原因,異常的捕獲方法主要有以下兩種:
1. 使用NSUncaughtExceptionHandler方法來對未捕獲到的OC層面異常進行捕獲。
2. 使用signal方法來注冊BCD信號攔截內核中的異常。
```
void InstallUncaughtExceptionHandler()
{
//通過NSUncaughtExceptionHandler注冊未捕獲的OC異常
NSSetUncaughtExceptionHandler(OCExceptionHandler);
//通過signal捕獲內核異常
signal(SIGABRT, SignalHandler);
signal(SIGILL, SignalHandler);
signal(SIGSEGV, SignalHandler);
signal(SIGFPE, SignalHandler);
signal(SIGBUS, SignalHandler);
signal(SIGPIPE, SignalHandler);
}
```
我們需要對注冊函數中的兩個handler進行集中處理。
處理過后的handler應該滿足我們的正常需求。
最近遇到兩次開發者賬號注冊設備異常問題如圖
平常我都是通過xcode注冊設備的,出現這種情況后的設備14天內就不能在該開發者賬號中使用了,這時需要在開發者賬號中手動添加新的測試設備,手動配置證書后就可以正常真機運行使用了。
補充:已經異常的設備無法移除,14天后自動過期。需要在開發者賬號中手動添加新的測試設備。
我們的程序經常出現異常造成閃退的現象,對于已經發布的APP,如何捕捉到這些異常,及時進行更新解決閃退,提高體驗感呢?
對于一些簡單,比如一些后臺數據的處理,容易重現數組越界,字典空指針錯誤的,我們用oc的runtime方法進行捕獲。比如NSArray的數組越界問題。
源碼地址: GitHub地址
我們可以通過runtime進行方法替換,比如我們捕獲NSArray的數組越界問題,注意NSArray 是個類簇所以不能簡單添加類目
當然這種捕獲只能捕獲單一的問題,還有其他的報錯,那就要寫很多的分類處理,如何進行統一的捕捉呢,我們查看下報錯信息看下能不找到有用的信息。
如圖我們看了報錯的方法棧。看到有libobjc的調用。這個就很熟悉了,去看下runtime的源碼。可以找到set_terminate設置中止的回調,也就是如果出現報錯,系統會回調這個函數,如果外界沒有傳這個函數objc_setUncaightExceptionHandler,系統會使用默認的實現。 我們只要調用NSSetUncaughtExceptionHandler就可以設置這個方法句柄,系統出現報錯時候,回調這個方法,從而讓我們對這個錯誤進行處理.
在AppDelegate里面設置這個方法句柄
然后就可以捕捉異常 ,上傳服務或者保存在本地。
然后在這個對象中通過runloop,保住線程,處理后再崩潰.
iOS開發中我們會遇到程序拋出異常退出的情況,如果是在調試的過程中,異常的信息是一目了然,但是如果是在已經發布的程序中,獲取異常的信息有時候是比較困難的。
iOS提供了異常發生的處理API,我們在程序啟動的時候可以添加這樣的Handler,這樣的程序發生異常的時候就可以對這一部分的信息進行必要的處理,適時的反饋給開發者。
不足的地方是,并不是所有的程序崩潰都是由于發生可以捕捉的異常的,有些時候是因為內存等一些其他的錯誤導致程序的崩潰,這樣的信息是不在這里體現的。
我做了一個簡單的類,進行很基本的操作,可以添加和獲取Handler,捕獲到異常后將信息寫入到app的Documens下的Exception.txt中。
其實還有很多的處理的辦法。
l 比如可以在程序下一次起來的時候讀取這個異常文件發生到服務端。
l 或者直接就是在處理代碼中用openurl的方式(mailto:)調用發送郵件的方式,將異常信息直接變成郵件發送到指定地址。
文章標題:ios開發異常處理,異常 ios
文章位置:http://www.yijiale78.com/article42/dschshc.html
成都網站建設公司_創新互聯,為您提供網站策劃、搜索引擎優化、網站制作、網站收錄、動態網站、營銷型網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯