通过检查数组计数防止数组索引崩溃,是否有任何性能问题?

时间:2013-04-10 12:57:00

标签: iphone ios crash

为了避免崩溃问题,如果我在访问每个索引(如下面的代码)之前检查数组计数,那么是否有任何性能问题?对于大型应用程序来说,这是一个好习惯还是坏习惯?

我的代码是:

-(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];
}

5 个答案:

答案 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)

我认为这样做不应该延误你的应用程序。

但请注意,当你编程时,如果事情以正确的方式完成,你的程序应该永远不会尝试获得不存在的数组位置。

您可以找到更多信息Bounds checking

答案 3 :(得分:0)

我认为它可以封装在类别中。或者,您可以使用运行时库更改标准实现。 如果在调试模式下添加类似断言的内容也会很棒,因此您不会隐藏发送错误索引的实现中的问题。 附:我认为它不会对性能产生显着影响。

答案 4 :(得分:0)

我认为没有任何理由要添加这样的支票,因为NSArray已经进行了类似的检查。当index无效时,它会引发异常。

现在,也许你在问为什么我认为提出异常比默默地跳过objectAtIndex更好。好吧,如果你试图索引那些不存在的东西,那就是一个bug。默默地跳过代码只会隐藏你的错误。