为了避免崩溃问题,如果我在访问每个索引(如下面的代码)之前检查数组计数,那么是否有任何性能问题?对于大型应用程序来说,这是一个好习惯还是坏习惯?
我的代码是:
-(BOOL)checkIndexAvailability:(NSArray *)array_ withIndex:(int)index_
{
if ((array_.count-1)>=index_) {
return TRUE;
}
return FALSE;
}
当我访问任何数组时,我这样称呼:
if ([self checkIndexAvailability:regDataArray withIndex:2]) {
lastName = [regDataArray objectAtIndex:2];
}
答案 0 :(得分:1)
我建议你做一个快速的内联检查,以使它更好一些。像这样:
lastName = (regDataArray.count - 1 > 2) ? [regDataArray objectAtIndex:2] : nil;
虽然你不会注意到与你的方式或我的方式不同的任何速度。
答案 1 :(得分:1)
在Alladanian,brainLikeApple和Kris Gellic的回答的帮助下,我明白防止阵列索引越界崩溃问题可以通过以下方式解决:
int arrayCount = [regDataArray count];
NSString *lastName = ( 2 <arrayCount) ? [regDataArray objectAtIndex:2] : @"Last Name Not Found";
NSString *address = ( 4< arrayCount) ? [regDataArray objectAtIndex:4] : @"No Address Found";
每次都不需要创建另一个方法或访问数组计数方法。
答案 2 :(得分:0)
答案 3 :(得分:0)
我认为它可以封装在类别中。或者,您可以使用运行时库更改标准实现。 如果在调试模式下添加类似断言的内容也会很棒,因此您不会隐藏发送错误索引的实现中的问题。 附:我认为它不会对性能产生显着影响。
答案 4 :(得分:0)
我认为没有任何理由要添加这样的支票,因为NSArray
已经进行了类似的检查。当index
无效时,它会引发异常。
现在,也许你在问为什么我认为提出异常比默默地跳过objectAtIndex
更好。好吧,如果你试图索引那些不存在的东西,那就是一个bug。默默地跳过代码只会隐藏你的错误。