常見的異常崩潰二

1、越界問題,包括數組越界(objectAtIndex:)、字符串越界(characterAtIndex:);

異常顯示:NSRangeException: -[__NSArrayI objectAtIndex:]: index 10 beyond bounds [0 .. 9]';

方案:在根據下標取值時,先進行邊界檢查判斷,如果沒有越界方可取值。

2、數據集合類型,如字典、數組中插入空nil元素時,字典的key和value都不能爲空;對於NSAttributedString,在addAttribute添加屬性時也不能爲nil

異常顯示:NSInvalidArgumentException:-[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]

方案:插入元素時,先判斷元素值、key和value值是否爲空,不爲空則插入;

3、調用當前對象類中不存在的屬性或方法導致崩潰,在編碼時Xcode一般會直接報錯,但在你將一個處理後的對象或服務器後臺接收後的對象進行賦值給一個新對象時,就有可能出現原對象和被賦值對象不屬於同一類,在想當然的去調用其屬性或方法時發生崩潰;尤其注意當服務器返回的數據類型和你接收時的數據類型不同、或服務器返回字段爲空時的情況。

異常顯示:[類名 方法名:]: unrecognized selector sent to instance,其中該類並不具備該方法

方案:提前和後臺約定好,並在接收時和使用時進行判斷保護

4、向野指針即已經被釋放的對象發送消息導致的崩潰。野指針其實指向的是一塊壞的內存,被釋放掉的內存;

異常顯示:EXC_BAD_ACCESS

方案:可以通過殭屍對象調試模式進行排查

5、對於代理方法的調用,如果直接通過類似於[self.delegate mothodXXX],有可能因爲self.delegate對象被釋放而崩潰;另,代理的聲明統一用weak

方案:在調用代理方法時,先進行self.delegate是否爲空和responsesToSelector:來判斷

6、cell的重用問題

異常顯示:unable to dequeue a cell with identifier cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard

方案:別漏了cell初始化的時候register identifier

7、KVO導致的崩潰

  1. 不匹配的移除和添加關係。

  2. 觀察者和被觀察者對象釋放的時候沒有及時斷開觀察者關係。

  3. 添加了重複的觀察者,但只移除了一次(iOS 11以下)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章