2

我有简单的代码可以执行,如果它崩溃了,我想捕获异常,这样应用程序就不会崩溃。

@try {
    x = [self try_doMyWork:Param];
} @catch (NSException* e) {
    NSLog(@"Exception");
}

虽然此代码在调试中工作并捕获异常(这是一个超出数组末尾的简单索引),但它在 iPhone 上的分布式应用程序中崩溃。

为什么会这样,我如何确保它也适用于分布式应用程序?

4

2 回答 2

2

在调试模式下,堆管理器可以在对象前后分配缓冲区(称为守卫),并用已知值(如 0x7F)填充这些守卫。它这样做是为了在您释放内存时测试这些守卫,并且可以判断您是否在分配内存的末尾(或在它的开始之前)写入。通过这种方式,它可以告诉您您的代码有错误(内存涂鸦)。

在发布模式下,它不会创建这些保护,因此当您在分配的内存之外写入时,会发生不好的事情(如崩溃)。

于 2013-03-30T03:02:56.600 回答
2

未捕获的应用程序级异常只是导致崩溃的原因之一。BSD 信号,如 EXC_BAD_ACCESS,也可能导致崩溃——捕获 NSExceptions 不会阻止这些。

如果不知道 try_doMyWork: 的详细信息,就不可能说出具体的崩溃是什么,但我认为 C 层(而不是 Objective-C 层)崩溃的最常见原因是内存管理问题 - 尝试写入或读取某些内容您的应用不应该访问。最可能的解释是您在调试中看到的异常与您在分发中看到的错误不同。

于 2013-03-30T03:04:59.227 回答