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开发中常见的一些异常的更多相关文章

  1. iOS 开发中常见的设计模式

    最近有小伙伴问到在iOS开发中的几种设计模式,这里摘录一下别人的总结(因为已经感觉总结得差不多了,适用的可以阅读一下) 首先是开发中的23中设计模式分为三大类:1.创建型 2.结构型 3.行为型 (i ...

  2. iOS开发中常见的语句@synthesize obj = _obj 的意义详解

    我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...

  3. iOS开发中常见的语句@synthesize obj=obj的意义详解

    我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...

  4. iOS开发中常见bug!(内附解答方法)

    序言 你是否曾经修复了一个 bug ,随后又发现了一个跟刚修复 bug 有关的 bug ,又或是修复 bug 的方式引起了另一个 bug ? 然而这些问题是绝佳的学习机会.所以我们怎样尽可能多地从修复 ...

  5. iOS开发中常见的问题

      1.重复调用2次loadView和viewDidLoad 最好不要在UIViewController的loadView方法中改变状态栏的可视性(比如状态栏由显示变为隐藏.或者由隐藏变为显示),因为 ...

  6. 转载iOS开发中常见的警告及错误

    iOS警告收录及科学快速的消除方法     前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下面的操作. ...

  7. iOS 开发中常见的崩溃错误

    1.duplicate symbols for architecture armv7   1.首先排查是否有名字重复的文件:   2.检查是否在#import头文件的时候,不小心把.h写成了.m. 2 ...

  8. 深入理解 iOS 开发中的锁

    来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89474/ 点击 → 申请加入伯乐在线专栏作者 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大 ...

  9. iOS开发系列-常见离线存储方式

    概述 在很多社交App手机在手机没有网络时,重新启动应用,依然能否展示上次访问的数据,提高用户体验,这个就是离线数据存储的运用场景.在iOS开发中常见的离线存储技术有Plist存储.个人偏好存储.解归 ...

随机推荐

  1. Android(java)学习笔记52:成员位置的内部类的介绍

    1. 内部类的定义 /* 内部类概述: 把类定义在其他类的内部,这个类就被称为内部类. 举例:在类A中定义了一个类B,类B就是内部类. 内部的访问特点: A:内部类可以直接访问外部类的成员,包括私有. ...

  2. 《编程导论(Java)·9.3.1回调·3》回调的实现

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yqj2065/article/details/31441221 接<9.3.1Java回调 · ...

  3. Jupyter notebook 的一个问题

    Traceback (most recent call last): File , in get value = obj._trait_values[self.name] KeyError: 'all ...

  4. 郑州集训day1自闭有感

    被拉到郑州培训了 考了一上午莫名自闭 帮助慎老师拿到\(rk1\)非常开心 简述一下题目吧 T1.まんふは函数 原题地址 考原题还行 据说是\(Huffman\)树 在成爷爷的再三讲解下,我终于明白了 ...

  5. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 B Tomb Raider 【二进制枚举】

    任意门:http://hihocoder.com/problemset/problem/1829 Tomb Raider 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 L ...

  6. out 和ref 的区别

    练习 1: 练习 2: 练习 3:

  7. Vue状态管理-Bus

    1.父子组件之间进行通讯: 父组件通过属性和子组件通讯,子组件通过事件和父组件通讯.vue2.x只允许单向数据传递. 先定义一个子组件AInput.vue: <template> < ...

  8. dijkstra 最小费用最大流

    前言:众所周知:spfa他死了 滑稽 dijkstra同样为最短路算法,为什么不能跑费用流qwq 好像是因为有负权边的缘故 但是如果我们如果使用某种玄学的将边权都拉回到正数的话 就可以跑了dijkst ...

  9. oracle 监听服务配置

    最近在red hat 6.6虚拟机上安装了Oracle 11gR2数据库,安装完毕,使用没有问题,通过主机也可以访问到虚拟机上的数据库.然而,在重新启动虚拟机后,主机无法访问到数据库,提示错误: PS ...

  10. OGG抽取进程异常问题排查一例

    1.问题现象抽取进程常常running,但是没有新产生trail文件,lag比较大 GGSCI (xxxdb) > info all Program Status Group Lag at Ch ...