为什么此代码在分布式应用程序上崩溃但在调试器中工作?

时间:2013-03-30 02:27:05

标签: ios objective-c exception-handling nsexception

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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