常見的線上異常崩潰一

2021-08-28 21:35:30 字數 2475 閱讀 4402

一.uitableview reloaddata的崩潰:

[tableview reloaddata]後當需要立即獲取tableview的cell、高度,或者需要滾動tableview,那麼直接在reloaddata後執行**是會有問題的。(如 在專案中用到scrolltorowatindexpath,但程式一旦呼叫scrolltorowatindexpath就出錯,經分析是資料來源和tableview中cell不同步的原因, 比如,dataarray中有3個元素,而tableview中只顯示了2個元素,當你scrolltorowatindexpath:[nsindexpath indexpathforrow:2 時當然就出錯了)

原因:因為[tableview reloaddata] 需要在當前方法在runloop中執行完後它再在runloop中執行,處理函式是在runloop中序列的排隊執行的。但是[tableview reloaddata]後面的**需要[tableview reloaddata]的計算結果,所以[tableview reloaddata]後面的**需要乙個延遲執行。只有當前方法不再占用runloop,[tableview reloaddata]才可以在runloop中執行,而這時延遲執行的部分在runloop中早就排在了[tableview reloaddata]的前面執行完了。如果表中的資料非常大,在乙個runloop週期沒執行完,這時需要tableview檢視資料的操作就會出問題了。

解決方法:(就是要等排隊,等tableview的重新整理操作完成,再去做滾動等其他操作)

方法1:layoutifneeded會強制重繪並等待完成

[self.tableview reloaddata];  

[self.tableview layoutifneeded];  

方法2:

reloaddata會在主佇列執行,而dispatch_get_main_queue會等待機會,直到主佇列空閒才執行。

[self.collectionview reloaddata];

dispatch_async(dispatch_get_main_queue(), ^

else

// 這種方式很坑的。注意底部資料的列印

if (a == yes)

else

bool b = a;

if (b)

else

if (b == yes)

else

2018-06-08 16:28:51.143529+0800 isbasedemo[27344:15315162] -[ishomepageviewcontroller buttonclick:] [line 119] ---1---

2018-06-08 16:28:51.143617+0800 isbasedemo[27344:15315162] -[ishomepageviewcontroller buttonclick:] [line 127] ---4---

2018-06-08 16:28:51.143632+0800 isbasedemo[27344:15315162] -[ishomepageviewcontroller buttonclick:] [line 131] ---5---

2018-06-08 16:28:51.143643+0800 isbasedemo[27344:15315162] -[ishomepageviewcontroller buttonclick:] [line 137] ---7---

你可以安全在 bool、_bool 以及 bool 之間轉換(參見 c++ std 4.7.4, 4.12 以及 c99 std 6.3.1.2)。你不能安全在 bool 以及 boolean 之間轉換,因此請把 boolean 當作乙個普通整形,就像之前討論的那樣。但 objective-c 的方法識別符號中,只使用 bool。

對 bool 使用邏輯運算子(&&,|| 和 !)是合法的,返回值也可以安全地轉換成 bool,不需要使用三目操作符。

錯誤的用法:

- (bool)isbold

- (bool)isvalid

正確的用法:

(bool)isbold {

return ([self fonttraits] & nsfontboldtrait) ? yes : no;

- (bool)isvalid {

return [self stringvalue] != nil;

- (bool)isenabled {

return [self isvalid] && [self isbold];

同樣,不要直接比較 yes/no 和 bool 變數。不僅僅因為影響可讀性,更重要的是結果可能與你想的不同。

錯誤的用法:

bool great = [foo isgreat];

if (great == yes)

// ...be great!

正確的用法:

bool great = [foo isgreat];

if (great)

// ...be great!

典型線上崩潰的復現

測試多年,崩潰遇到無數,這個崩潰是比較典型的可以拿來紀念一下 背景 線上出現崩潰bug,開發修復了,測試一下上線 目的 檢視是否修復成功 步驟 復現崩潰,驗證崩潰是否修復 測試思路 1 安裝線上版本的測試包 2 復現bug,比較坑的是 沒有明確的崩潰步驟,首先要收集資料 bug日誌空,找開發要 公式...

程式崩潰的常見原因

常出現程式崩潰的幾種狀況 程式崩潰對於程式猿來說,時經常出現的問題,如果你都沒有出現過,那大佬快收下我的膝蓋吧。程式崩潰一般都發生在執行時期,而崩潰的原因一般都是程式猿的失誤所導致的,在這裡我就總結了這幾種程式崩潰的 讀取未賦值的變數 這個錯誤一般是由於程式猿粗心大意,沒有給變數初始化和賦值,導致該...

異常 常見的異常

在程式設計中異常處理會被頻繁的使用,所以有必要知道一些常見的異常。nullpointexception 空指標異常,屬於執行時異常。簡單來說就是呼叫了未經初始化的物件或者不存在的物件,或者是訪問或修改null物件的屬性或方法。classnotfoundexception 找不到類異常。出現這種情況一...