博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS Crash之NSInvalidArgumentException
阅读量:4111 次
发布时间:2019-05-25

本文共 2368 字,大约阅读时间需要 7 分钟。

非法参数异常(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文件里没有修改,导致方法的实现没有
你可能感兴趣的文章
SpringBoot+WebSocket
查看>>
基本数据类型,string类型的瞎扯,final喜欢干的事儿。final string
查看>>
PAT乙级1011
查看>>
常用网络技术
查看>>
AlertDialog.Builder提示对话框
查看>>
Fedora安装ns2.34需要的一些依赖包
查看>>
Python基础4
查看>>
http://my.oschina.net/chihz/blog/56256
查看>>
现代软件工程 第十二章 【用户体验】练习与讨论
查看>>
反射在ADO.NET中的运用(你还在每个项目中循环遍历DataTable吗)
查看>>
Linux -- dd 命令
查看>>
寒假开学回忆
查看>>
太上感应篇原文
查看>>
ubuntu学习笔记--不断更新中
查看>>
mac 安装 tomcat 配置
查看>>
linux下正确安装jsoncpp
查看>>
document.body.scrollTop等常见易混淆属性整理
查看>>
基于EasyUI的软件框架打造-树(Tree)封装
查看>>
关于模板该不该用css强制编辑器文本开头空两格
查看>>
KMP 算法实现
查看>>