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导致的崩溃
-
不匹配的移除和添加关系。
-
观察者和被观察者对象释放的时候没有及时断开观察者关系。
-
添加了重复的观察者,但只移除了一次(iOS 11以下)