iOS中的卡頓及crash的原因及解決辦法

ios發(fā)現(xiàn)ANR或者crash排查的方法和需要哪些相關(guān)的信息,對于發(fā)現(xiàn)偶現(xiàn)的ANR和Crash應(yīng)該如何做到避免影響到線上用戶

ANR即(application not responding),即應(yīng)用無響應(yīng)。Crash 即程序崩潰。這兩種情況的發(fā)生會給用戶不友好的體驗。在應(yīng)用發(fā)布之前應(yīng)盡量避免。所以在開發(fā)的過程中如何對這兩種情況做到查漏補缺,主要有以下這些方案。

ANR:程序為何會出現(xiàn)“無響應(yīng)”的狀態(tài)。在iOS應(yīng)用中,所有的UI操作及更新都是在主線程完成,并且主線程的runloop是逐個處理用戶事件的(當然其他的runloop也一樣),所以主線程必須等待上一次事件處理完成后才能繼續(xù)響應(yīng)下一次事件。絕大部分用戶感知到的卡頓就是由于主線程阻塞了,在處理某次事件消耗了過長的時間,導(dǎo)致主線程處于等待狀態(tài),無法及時響應(yīng)用戶的下一次輸入事件。由于iOS 上的 UIKit 只能在主線程進行處理,導(dǎo)致開發(fā)者在開發(fā)過程中不經(jīng)意間在主線程做了一些消耗時間的工作,導(dǎo)致了應(yīng)用卡頓。

避免卡頓的黃金法則就是不要讓主線程干重活,例如網(wǎng)絡(luò)請求,讀寫大文件,復(fù)雜的運算 等一些耗費大量系統(tǒng)資源及時間的任務(wù)。充分利用好 iOS 的多線程,如 NSThread、NSO peration Queue,GCD 等干臟活,累活,讓主線程能及時迅速的響應(yīng)用戶事件。

Crash是用戶使用應(yīng)用的過程中最糟糕的體驗,也是程序員最深惡痛絕的BUG。然而,每位程序員都免不了接觸crash事件。應(yīng)用Crash的產(chǎn)生主要有以下原因:

1.調(diào)用懸浮指針

2.數(shù)組越界訪問

3.調(diào)用了未實現(xiàn)的方法

4.調(diào)用的庫函數(shù)版本高于本機

5.返回空cell

6.類釋放時未remove通知,之后收到通知

7.類釋放時delegate未置空,之后被回調(diào)

8.使用nil做初始化操作,例如:

NSString*str =nil;



NSDictionary*dic =@{@"name":@"emma",@"age":str};

再如:

[NSString strWithFormat:nil];

9.NSRange訪問越界,例如:

NSString *str = @"abcedfh";

NSRange range = NSMakeRange(5, 9);

[str substringWithRange:range];

10.對象對應(yīng)關(guān)系異常。例如a實例removeObserver一個非a類關(guān)聯(lián)的監(jiān)聽對象。

11.delegate先于tableview被置空,后收到關(guān)于table或者scroll的調(diào)用.

12.系統(tǒng)內(nèi)存不足。

對于Crash的解決也都不同,一般必現(xiàn)的Crash可以通過對代碼仔細的閱讀輔以斷點調(diào)試幾乎都可以找出來。對于隱藏較深的Crash問題可以通過以下手段。

A : 企業(yè)內(nèi)部測試階段:找到發(fā)包時的.ipa文件以及打包時archive生成的.dSYM文件以及應(yīng)用使用過程中產(chǎn)生的.crash文件。通過對這三個文件的解析。可以查看應(yīng)用程序具體的崩潰原因,以及崩潰什么地方。

B:應(yīng)用已經(jīng)安裝到用戶手機中,此時的crash可以通過一些第三方的工具進行獲取,常用的有Bugly、Testin、友盟等。但是需要在研發(fā)的過程中將這些第三方的SDK集成到自己的代碼中。

如果線上程序出現(xiàn)Crash的問題,首先要做的是定位BUG產(chǎn)生的原因。

1、如果是服務(wù)端返回的異常數(shù)據(jù)沒做兼容,就由服務(wù)端確保格式正確,客戶端看情況是否要做兼容;

2、如果是升級版本后的由于本地數(shù)據(jù)庫或本地存儲的數(shù)據(jù)格式未兼容等問題,一般需要撤下版本重新提交;

3、如果是業(yè)務(wù)代碼中只是簡單的數(shù)組越界之類,就很適合使用熱修復(fù)技術(shù),比如JSPatch,但是前提是已經(jīng)發(fā)布的版本集成過熱修復(fù)模塊,否則也要重新發(fā)布版本。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容