调用block时没有判断Block是否为空
如果block为nil,直接调用会crash
ALiBlock block;
block(); //block是空的,妥妥的crash
正确的使用方法是先判断block是否为空
if (block) {
block(); //确定不为空之后才放心地调用
}
调用了不存在的方法
如果不确定对象中是否有该方法,直接调用会有可能导致crash
NSObject *a = [][NSObject alloc] init];
[a aaa]; //NSObject里没有叫aaa的方法,这样会crash
正确的使用方法是在不确定对象是否有该方法时,先判断一下
if ([a respondsToSelector:@selector(aaa)]) {
[a aaa]; //确定有该方法之后才放心地调用
}
在cellForRowAtIndexPath中返回了nil
当cellForRowAtIndexPath中返回nil时,会直接crash。
出现这种情况的原因有:
numberOfRowsInSection返回的数目不正确,导致行数比cellForRowAtIndexPath预期的多,于是cellForRowAtIndexPath就不能正确返回超出预期的cell了。
cellForRowAtIndexPath中逻辑有误,漏了一些情况,导致有些cell不能正确返回。
数组越界
这种老问题不用多说,大家都很熟悉,但是又经常出现。 = = |||
数组插入了nil对象
在数组中nil表示数组的结束位置。所以对数组进行insert或addObject操作时,如果插入了一个nil对象,那访问该对象之后的元素都会变成越界,OC为了安全,在插入nil的时候会直接crash。
正确使用方式是如果不确定一个元素是不是为空,就判断一下吧。
重复release,或者不需要之后没有置空
比如以下这个情况就会crash
UILabel *text = [[UILabel alloc] init];
[text release];
...// 中间干了很多事情
[text release];
NSLog(@"%@",text);