1. 程式人生 > >常見的異常崩潰二

常見的異常崩潰二

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以下)