调用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);
网友评论