您的位置:首页 > 移动开发 > IOS开发

iOS Crash之NSInvalidArgumentException

2016-07-18 14:33 543 查看
非法参数异常(NSInvalidArgumentException)是 Objective -C 代码最常出现的错误,所以平时在写代码的时候,需要多加注意,加强对参数的检查,避免传入非法参数导致异常,其中尤以nil参数为甚。

集合对象的参数传递

在我们编码中经常会对NSDictionary,NSMutableArray, NSMutableDictionary等进行数据操作,在传递参数时,需要判断参数的类型,否则很容易出错。一般我们自己单独使用这些集合对象时,可能会注意到参数的处理,但在一个大的项目中时,这个参数可能是由其他模块传递进来的,往往会忽略参数检查。

1. NSMutableDictionary添加对象

setObject:forKey



key和value都不能为nil,否则会出现NSInvalidArgumentException异常  





setObject:forKeyedSubscript



key不能为nil,,否则会出现NSInvalidArgumentException异常;object可以为nil



2. NSMutableDictionary删除对象

removeObjectForKey



key不能为nil



3. NSDictionary初始化

dictionaryWithObject:forKey



key和value都不能为nil



dictionaryWithObjects:forKeys



objects和keys必须是一样多的元素



dictionaryWithObjects:forKeys:count



keys和objects都不能为nil



dictionaryWithObjectsAndKeys



任意key不能为nil



4. NSArray获取匹配的下标

- indexOfObject:inSortedRange:options:usingComparator:



obj不能为nil



cmp不能为NULL



opts的设置也有一定的限制条件



5. 给NSArray对象发送消息

- makeObjectsPerformSelector:



aSelectior不能为NULL



6. 给NSArray的某个对象发送消息
- makeObjectsPerformSelector:withObject:
aSelectior不能为NULL



7. NSArray添加对象后返回新的NSArray
- arrayByAddingObject:



anObject不能为nil



8. NSMutableArray添加对象

- addObject:



anObject不能为nil



9. NSMutableArray插入对象

- insertObject:atIndex:



anObject不能为nil



10. NSMutableArray替换对象

- replaceObjectAtIndex:withObject:



anObject不能为nil



11. NSMutableArray设置对象

- setObject:atIndexedSubscript:



anObject不能为nil



其他一些API的使用

1. NSString初始化

- initWithString:



aString不能为nil



2. NSString格式初始化

- initWithFormat:



format不能为nil



- initWithFormat:arguments:



- initWithFormat:locale:



- initWithFormat:locale:arguments:



 




3. NSString其他NSString对象初始化

aString不能为nil





4. NSString的其他操作

aSet不能为nil









5. NSMutableString的格式初始化



format不能为nil

6. NSMutableString的替换操作

- replaceOccurrencesOfString:withString:options:range:



target和replacement都不能为nil





7. NSURL的初始化

- initFileURLWithPath:isDirectory:

可能出现'nil string parameter'的错误



(1)、传递的参数是nil
(2)、参数如果不为nil的话,那就是这个文件没被target识别,确定添加是否正确或者重新添加

8. NSString的前后缀操作
可能出现‘nil argument’的错误



未实现的方法

1.
类别(category)

在使用第三方库的时候,忘了添加"-ObjC"的flag或者自己的项目中定义了category,在使用category时有可能出现崩溃,因为category没有被链接进APP

解决办法:
(1). 如果是三方SDK或者自己的工程,则修改配置,"Building Settings" -> "Linking" -> "Other Linker Flags" 添加"-ObjC"
(2). 如果是自己开发的SDK,在修改 "Building Settings" -> "Linking" -> "Preform Single-Object Prelink"为"YES".使用SDK的APP就不需要做任何修改了

2.
对象被提前释放

大部分情况下是因为对象被提前release了,在你心里不希望他release的情况下,指针还在,对象已经不在了。

解决办法:检查对象的引用计数的正确性

3.方法没有实现
在我们开发过程中,经常修改方法名,可能出现.h文件里修改,但是.m文件里没有修改,导致方法的实现没有
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息