iOS開發中常見的一些異常
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開發中常見的一些異常