1. 程式人生 > >iOS開發中常見的一些異常

iOS開發中常見的一些異常

ron 文件 數值 range rom hold 要去 param 空間不足

iOS開發中常見的異常包括以下幾種
NSInvalidArgumentException
NSRangeException
NSGenericException
NSInternallnconsistencyException
NSFileHandleOperationException


NSInvalidArgumentException
非法參數異常是objective-C代碼最常出現的錯誤,所以平時寫代碼的時候,需要多加註意,加強對參數的檢查,避免傳入非法參數導致異常,其中尤以nil參數為甚。

1、集合數據的參數傳遞
比如NSMutableArray,NSMutableDictionary的數據操作

(1)NSDictionary不能刪除nil的key
NSInvalidArgumentException reason, -[__NSCFDictionary removeObjectForKey:]:attempt to remove nil key

(2)NSDictionary不能添加nil的對象
NSInvalidArgumentException reason,***-[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[4]

(3)不能插入nil的對象
NSInvalidArgumentException reason,***-[__NSArrayM insertObject:atIndex:]: object cannot be nil

(4)其他一些nil參數
NSInvalidArgumentException reason, -[__NSCFString hasSuffix:]: nil argument

2、其他一些API的使用
APP一般都會有網絡操作,免不了使用網絡相關接口,比如NSURL的初始化,不能傳入nil的http地址:NSInvalidArgumentException reason,***-[NSURL initFileURLWithPath:]: nil string parameter

3、為實現的方法
(1).h文件裏函數名,卻忘了修改.m文件裏對應的函數名
(2)使用第三方庫時,沒有添加”-ObjC”flag
(3)MRC時,大部分情況下是因為對象被提前release了,在我們心裏不希望他release的情況下,指針還在,對象已經不在了。
NSInvalidArgumentException reason =-[UIKBBlurredKeyView candidateList]: unrecognized selector sent to …
NSInvalidArgumentException reason =-[UIThreadSafeNode_responderForEditing]: unrecognized selector sent …

NSRangeException
越界異常(NSRangeException)也是比較常出現的異常,有如下幾種類型:
1、數組最大下標處理錯誤
比如數組長度count,index的下標範圍[0,count-1],在開發時,可能index的最大值超過數組的範文;
NSRangeException reason = ***-[_NSarrayM objectAtIndex:]: index 19 beyond bounds [0..15]

2、下標的值是其他變量賦值
這樣會有很大的不確定性,可能是一個很大的整數值
NSRangeException reason = ***-[_NSarrayM objectAtIndex:]: index 2147483647 beyond bounds [0..4]
NSRangeException reason = ***-[_NSarrayM objectAtIndex:]: index 18446744073709551615 beyond bounds [0..4]

3、使用空數組
如果一個數組剛剛初始化還是空的,就對它進行相關操作
NSRangeException reason = ***-[_NSarrayM objectAtIndex:]: index 0 beyond bounds for empty array
所以,為了避免NSRangeException的發生,必須對傳入的index參數進行合法性檢查,是否在集合數據的個數範圍內。

NSGenericException
NSGenericException這個異常最容易出現在foreach操作中,在for in循環中如果修改所遍歷的數組,無論你是add或remove,都會出錯,比如:

for (id elem in arr) {

[arr removeObject:elem];

}



執行上面的代碼會出現以下錯誤:
NSGenericException reason = *** Collection<__NSArrayM:0x175058330>was mutated whild being enumerated.
原因就在這 “for in”,它的內部遍歷使用了類似 Iterator進行叠代遍歷,一旦元素變動,之前的元素全部被失效,所以在foreach的循環當中,最好不要去進行元素的修改動作,若需要修改,循環改為for遍歷,由於內部機制不同,不會產生修改後結果失效的問題。

for (NSINteger i=0; i<[arr count]; i++) {

id elem = [arr objectAtIndex:i];

[arr removeObject:elem];

}



NSMallocException
這也是內存不足的問題,無法分配足夠的內存空間
NSMallocException reason = ***-[NSConcreteMutableData appendBytes:length:]: unable to allocate memory for length(81310)

NSFileHandleOperationException
處理文件時的一些異常,最常見的還是存儲空間不足的問題,比如應用頻繁的保存文檔,緩存資料或者處理比較大的數據:
NSFileHandleOperationException reason:***-[NSConcreteFileHandle writeData:]: No space left on device
所以在文件處理裏,需要考慮到手機存儲空間的問題。


原文:://blog.csdn.net/qq_16270605/article/details/52259638

iOS開發中常見的一些異常