iOS Crash之NSInvalidArgumentException
2016-07-18 14:33
543 查看
非法参数异常(NSInvalidArgumentException)是 Objective -C 代码最常出现的错误,所以平时在写代码的时候,需要多加注意,加强对参数的检查,避免传入非法参数导致异常,其中尤以nil参数为甚。
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
- 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’的错误
类别(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文件里没有修改,导致方法的实现没有
集合对象的参数传递
在我们编码中经常会对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文件里没有修改,导致方法的实现没有
相关文章推荐
- IOS开发中NSURL的基本操作及用法详解
- IOS UI学习教程之区分NSBundle和NSURL(读取文件、写入文件)
- 关于NSUrl
- OC学习之--字典&集合
- IOS开发-Foundation笔记(二)
- 黑马程序员----OC学习笔记之NSArray
- 黑马程序员----OC学习之NSDictionary及NSMutableDictionary
- NSMutableArray addObject覆盖问题
- 数组访问方式
- NSDictionary与NSMutableDictionary的常用方法
- Object-c之可变数组
- Object-c之可变字典
- ios开发极易犯的错误
- 渣蜀黍 - iOS 个人笔记(一)_数据处理
- 黑马程序员——入学Blog04----OC的构造方法
- Foundation-NSMutableArray
- Foundation-NSDictionary
- Foundation-NSMutableDictionary
- 深复制和浅复制
- NSMutableArray的正确使用