iOS Crash之NSInvalidArgumentException

非法参数异常(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文件里没有修改,导致方法的实现没有



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值