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开发中常见的一些异常的更多相关文章
- iOS 开发中常见的设计模式
最近有小伙伴问到在iOS开发中的几种设计模式,这里摘录一下别人的总结(因为已经感觉总结得差不多了,适用的可以阅读一下) 首先是开发中的23中设计模式分为三大类:1.创建型 2.结构型 3.行为型 (i ...
- iOS开发中常见的语句@synthesize obj = _obj 的意义详解
我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...
- iOS开发中常见的语句@synthesize obj=obj的意义详解
我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...
- iOS开发中常见bug!(内附解答方法)
序言 你是否曾经修复了一个 bug ,随后又发现了一个跟刚修复 bug 有关的 bug ,又或是修复 bug 的方式引起了另一个 bug ? 然而这些问题是绝佳的学习机会.所以我们怎样尽可能多地从修复 ...
- iOS开发中常见的问题
1.重复调用2次loadView和viewDidLoad 最好不要在UIViewController的loadView方法中改变状态栏的可视性(比如状态栏由显示变为隐藏.或者由隐藏变为显示),因为 ...
- 转载iOS开发中常见的警告及错误
iOS警告收录及科学快速的消除方法 前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下面的操作. ...
- iOS 开发中常见的崩溃错误
1.duplicate symbols for architecture armv7 1.首先排查是否有名字重复的文件: 2.检查是否在#import头文件的时候,不小心把.h写成了.m. 2 ...
- 深入理解 iOS 开发中的锁
来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89474/ 点击 → 申请加入伯乐在线专栏作者 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大 ...
- iOS开发系列-常见离线存储方式
概述 在很多社交App手机在手机没有网络时,重新启动应用,依然能否展示上次访问的数据,提高用户体验,这个就是离线数据存储的运用场景.在iOS开发中常见的离线存储技术有Plist存储.个人偏好存储.解归 ...
随机推荐
- Uva 12298 超级扑克2
题目链接:https://vjudge.net/problem/UVA-12298 题意: 1.超级扑克,每种花色有无数张牌,但是,这些牌都是合数:比如黑桃:4,6,8,9,10,,,, 2.现在拿走 ...
- POJ 3635 Full Tank? 【分层图/最短路dp】
任意门:http://poj.org/problem?id=3635 Full Tank? Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- 【洛谷P3807】(模板)卢卡斯定理
卢卡斯定理 把n写成p进制a[n]a[n-1][n-2]…a[0],把m写成p进制b[n]b[n-1][n-2]…b[0],则C(n,m)与C(a[n],b[n])*C(a[n-1],b[n-1])* ...
- 【题解】洛谷P1006传纸条
链接 https://www.luogu.org/problemnew/show/P1006 日常牢骚 过年前最后一节课上完了坐标DP 也接触了一点区间DP(noi1995石子合并)下次做做看看吧 老 ...
- HDU 1226 超级密码(数学 bfs)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1226 超级密码 Time Limit: 20000/10000 MS (Java/Others) ...
- 推荐几个Mac/Linux下比较好用的工具
1.Tmux,连接开发机可以让在任务在开发机一直执行,不用nohup &这种了也相对稳定,还有session可以记录当时的状态. 常用命令: tmux new -s name 指定名字开启一个 ...
- AngularJS 四 服务
AngularJS服务: API: https://docs.angularjs.org/api/ng/service 下面只会介绍几种,需要的话可以去官网查看 AngularJS服务 ...
- Android中得到布局文件对象有三种方式
Android中得到布局文件对象有三种方式 第一种,通过Activity对象 View view = Activity对象.getLayoutInflater().inflater(R.layout. ...
- 移动端Vue回到顶部
html: <div class="totop" id="totop" @click="Top" v-show="totop ...
- JNI 和 socket api
1.JavaVM 和 JNIEnvJNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立.JavaVM是虚拟机在JNI层的代表,在一个虚拟机进程中只有一个JavaVM,因此该进程的所有线程 ...