1

我是 iPhone 新手,

我们的团队创建了一个应用程序并上传到“AppStore”,我们还集成了“Bug Sense”。

现在我们的应用程序因为崩溃而受到负面评价,我们在 iPhone/iPad 6.1.3 中测试了我们的应用程序

在我的错误意义上,我们得到了如下报告:

第一个错误:

-[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array [open]

第二个错误:

-[__NSArrayM objectAtIndex:]: index 61 beyond bounds for empty array [open]

现在在我的项目中,我将@try{ } catch 块放置到使用“ objectAtIndex”来防止崩溃的方法中,

我也放置了条件,即如果数组计数大于“0”,那么只有它会进入我使用“ objectAtIndex”的条件

我的问题是,我们能否通过使用@try, catch mechanism.

提前致谢

4

4 回答 4

16

不,您不应该使用它@catch来从异常中恢复并继续执行,就好像什么都没发生一样

有两个原因:

首先,您的代码中有一个错误。使用@catch捕获异常并忽略它不是解决方法。您只是在解决一个症状,但错误仍然存​​在。

其次,流控制的异常——处理可恢复错误的异常——在 iOS/Cocoa 编程中是明确不支持的。如果通过调用系统引发异常,则行为未定义。

如果您想了解更多详细信息,请在此处查看我的答案:iPhone 应用程序中 NSException 的使用

于 2013-06-06T16:56:00.973 回答
2

Apple 的文档中,你有这个例子:

[...] 例如,在 NSArray 的情况下,您应该始终检查数组的计数以确定项目数,然后再尝试访问给定索引处的对象。如果您发出越界请求,objectAtIndex: 方法会引发异常,以便您可以在开发周期的早期发现代码中的错误——您应该避免在交付给用户的应用程序中引发异常。

于 2013-06-06T11:49:23.153 回答
1

这不会打破

if([array count]>n)
obj =[array objectAtIndex:n]
于 2013-06-06T11:59:40.777 回答
0

您可以使用提供一个(或多个类似)方法的类别来扩展 NSArray。

- (id) saveObjectAtIndex:(NSUInteger)n {
    return (n < [self count]) ? [self objectAtIndex:n] : nil;
}

或者为此使用宏,这在性能方面可能是更好的方法。

坦率地说,我自己从来没有这样做过。为什么?如果我这样做了,那么我必须检查 nil 并做出相应的反应。因此,最终它与检查正值(如果索引变量已签名)并将其与计数属性进行比较然后对错误条件做出反应的工作量相同。从心理上讲,每次自己做都会引导我编写高质量的代码,并支持我对容错编码的认识。

于 2013-06-06T12:26:06.373 回答