常见的异常崩溃二

21 篇文章 0 订阅

1、越界问题,包括数组越界(objectAtIndex:)、字符串越界(characterAtIndex:);

异常显示:NSRangeException: -[__NSArrayI objectAtIndex:]: index 10 beyond bounds [0 .. 9]';

方案:在根据下标取值时,先进行边界检查判断,如果没有越界方可取值。

2、数据集合类型,如字典、数组中插入空nil元素时,字典的key和value都不能为空;对于NSAttributedString,在addAttribute添加属性时也不能为nil

异常显示:NSInvalidArgumentException:-[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]

方案:插入元素时,先判断元素值、key和value值是否为空,不为空则插入;

3、调用当前对象类中不存在的属性或方法导致崩溃,在编码时Xcode一般会直接报错,但在你将一个处理后的对象或服务器后台接收后的对象进行赋值给一个新对象时,就有可能出现原对象和被赋值对象不属于同一类,在想当然的去调用其属性或方法时发生崩溃;尤其注意当服务器返回的数据类型和你接收时的数据类型不同、或服务器返回字段为空时的情况。

异常显示:[类名 方法名:]: unrecognized selector sent to instance,其中该类并不具备该方法

方案:提前和后台约定好,并在接收时和使用时进行判断保护

4、向野指针即已经被释放的对象发送消息导致的崩溃。野指针其实指向的是一块坏的内存,被释放掉的内存;

异常显示:EXC_BAD_ACCESS

方案:可以通过僵尸对象调试模式进行排查

5、对于代理方法的调用,如果直接通过类似于[self.delegate mothodXXX],有可能因为self.delegate对象被释放而崩溃;另,代理的声明统一用weak

方案:在调用代理方法时,先进行self.delegate是否为空和responsesToSelector:来判断

6、cell的重用问题

异常显示:unable to dequeue a cell with identifier cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard

方案:别漏了cell初始化的时候register identifier

7、KVO导致的崩溃

  1. 不匹配的移除和添加关系。

  2. 观察者和被观察者对象释放的时候没有及时断开观察者关系。

  3. 添加了重复的观察者,但只移除了一次(iOS 11以下)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值