1

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

我的代码是:

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

5 回答 5

1

我建议只做一个快速的内联检查,让它更好一点。像这样的东西:

lastName = (regDataArray.count - 1 > 2) ? [regDataArray objectAtIndex:2] : nil;

尽管您不会注意到与您或我的方式有任何不同的速度。

于 2013-04-10T13:13:03.067 回答
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";

不需要每次都创建另一个方法或访问数组计数方法。

于 2013-04-10T13:37:48.817 回答
0

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

但是请考虑到,当您编程时,如果事情以正确的方式完成,您的程序永远不应该尝试获取不存在的数组位置的东西。

您可以找到更多信息边界检查

于 2013-04-10T13:05:47.940 回答
0

我认为它可以封装在类别中。或者,您可以使用运行时库更改标准实现。如果您在调试模式下添加诸如断言之类的东西也会很棒,这样您就不会在实现中隐藏发送错误索引的问题。PS我认为它不会显着影响性能。

于 2013-04-10T13:17:27.030 回答
0

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

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

于 2013-04-10T13:31:13.930 回答